需要一些关于iOS项目面向对象设计的建议吗
我有一些关于代码设计的问题。这可能需要很长时间。我会尽可能缩短它 Q1)依亲还是独立? 创建一个类并添加所需的功能,以便允许对象更改其自身的状态,而不是控制器(又称viewcontroller)正在更改的状态 我发现在尝试交流时,代码示例是最好的: 注意:我减少了一些代码行。源代码 无论如何,如果我必须为一个账户设置账户余额,它建议我这样做:需要一些关于iOS项目面向对象设计的建议吗,ios,iphone,objective-c,Ios,Iphone,Objective C,我有一些关于代码设计的问题。这可能需要很长时间。我会尽可能缩短它 Q1)依亲还是独立? 创建一个类并添加所需的功能,以便允许对象更改其自身的状态,而不是控制器(又称viewcontroller)正在更改的状态 我发现在尝试交流时,代码示例是最好的: 注意:我减少了一些代码行。源代码 无论如何,如果我必须为一个账户设置账户余额,它建议我这样做: @interface BankAccount: NSObject { double accountBalance; long accoun
@interface BankAccount: NSObject
{
double accountBalance;
long accountNumber;
}
-(double) getAccountBalance;
-(void) setAccountBalance: (double) x;
@end
// Implementation Section Starts Here
@implementation BankAccount
-(void) setAccountBalance: (double) x
{
accountBalance = x;
}
-(double) getAccountBalance
{
return accountBalance;
}
@end
//usage
BankAccount *account1 = [BankAccount alloc] init];
[account1 setAccountBalance: 1500.53];
----但是我相信我会在控制器中这样写:------
因为我相信是我(meViewController)设置帐户余额,而不是帐户本身,因为帐户只是一个帐户。
这是个很坏的主意吗?通过他们的示例,我可以看到对象可以照顾自己(独立),这意味着改变自己的状态,而我的方法是,只能通过控制器(依赖)修改银行账户
Q2)控制器中应该/不应该有什么?
我还读到,控制器内部编写的代码应仅用于:
响应用户交互和更新视图
这是否意味着我不应该在控制器中执行以下操作:
从NSUserDefault读取或写入NSUserDefault。因为它是单例的,所以我认为无论哪个控制器当前处于活动状态,都更容易写入它?坏主意?
我知道我应该将数据(包括NSUserDefaults)保存在ApplicationIdentinterBackground和applicationWillTerminate中,因此保存在其他地方(例如,另一个控制器)是个坏主意
问题3)您最常用的设计模式是什么?您错误地滥用了哪些设计模式?
单身人士:
我的理解是[UIApplication sharedApplication]、[NSNotification defaultCenter]和其他单例可以通过所有控制器访问,NSObject子类如何?或者UIView子类
显然,当模型更新时,您可以使用NSNotification通知其他控制器。
有人能告诉我什么时候使用和如何使用的例子吗?
也许当您导入一些属性不同于最初预期的数据时,观察员会收到升级数据模型的通知,这是您在数据模型内通知控制器的一个示例吗
现在这些问题已经足够了
对不起,我必须把它们都从我的脑子里弄出来:-)
本第一件事:不要用这个
@interface BankAccount: NSObject
{
double accountBalance;
long accountNumber;
}
-(double) getAccountBalance;
-(void) setAccountBalance: (double) x;
@end
这里,accountBalance
ivar是公共的,而它应该是私有的
相反,请使用@属性
:
@interface BankAccount: NSObject
@property (assign, nonatomic) double accountBalance;
@end
这将定义一个setter:
- (void)setAccountBalance:(double)accountBalance { ... }
还有一个能手:
- (double)accountBalance { ... }
以及名为\u accountBalance
的私有实例变量(ivar)
然后,您可以在实现中使用:
@synthesize accountBalance;
它将自动创建setter/getter,如下所示:
- (void)setAccountBalance:(double)accountBalance {
_accountBalance = accountBalance;
}
- (double)accountBalance {
return _accountBalance;
}
第一件事:不要用这个
@interface BankAccount: NSObject
{
double accountBalance;
long accountNumber;
}
-(double) getAccountBalance;
-(void) setAccountBalance: (double) x;
@end
这里,accountBalance
ivar是公共的,而它应该是私有的
相反,请使用@属性
:
@interface BankAccount: NSObject
@property (assign, nonatomic) double accountBalance;
@end
这将定义一个setter:
- (void)setAccountBalance:(double)accountBalance { ... }
还有一个能手:
- (double)accountBalance { ... }
以及名为\u accountBalance
的私有实例变量(ivar)
然后,您可以在实现中使用:
@synthesize accountBalance;
它将自动创建setter/getter,如下所示:
- (void)setAccountBalance:(double)accountBalance {
_accountBalance = accountBalance;
}
- (double)accountBalance {
return _accountBalance;
}
阅读斯坦福大学关于MVC的讲座。我想你会在那里找到很多答案阅读斯坦福大学关于MVC的讲座。我想你会在那里找到很多答案Q1)模型层对象,特别是那些将与之交互和变异的对象,应该负责它们自己的内部表示,以及表示交互规则的知识。对于银行账户,我认为你提出的两种方法都是错误的。第二个原因尤其重要,因为它实际上甚至承担了更新账户状态的责任。但是第一个也是因为它只提供了一个
setBalance
方法,这在现实世界中没有意义。无论谁使用该账户,现在都必须处理所有转账、取款、存款、利息等逻辑。实际上,一个银行账户应该有存款、取款、余额等方法,这样它就可以表示这些交互作用发生的规则和逻辑。在这种情况下,借鉴这在现实生活中的作用可能会有所帮助
问题2)这在很大程度上取决于应用程序的设置方式。一个简单应用程序的模型层可能只是一个plist或nsserdefaults
和一些NSDictionary
实例。在这种情况下,您可能不希望视图控制器与之交互,但可能需要数据控制器对象。但是,您可能不需要让视图控制器与这种模型对话。但是,当事情变得更复杂时,您肯定需要分离关注点,让控制器对象更接近数据模型,或者让更复杂的模型提供它们的交互规则。就我个人而言,我不想让所有视图控制器都加载NSUserDefaults,您只需要创建一个数据控制器类来处理它,并根据需要实例化它
问题3)我在这里看到两个问题。不确定“所有控制器均可访问”是什么意思。但是当正确使用时,NSNotification非常有用。假设您有3个视图控制器,所有这些控制器协调银行账户的不同视图-一个是分类账,一个是饼图,一个是预算计算器。当应用程序从互联网上请求刷新银行账户信息时,当该请求返回时,它可以立即通知所有三个视图控制器,它们可以相应地刷新视图。当你有一个以上的对象想要知道发生了什么事情时,它就真的被使用了
希望这有帮助,如果你有任何疑问,请告诉我