Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要一些关于iOS项目面向对象设计的建议吗_Ios_Iphone_Objective C - Fatal编程技术网

需要一些关于iOS项目面向对象设计的建议吗

需要一些关于iOS项目面向对象设计的建议吗,ios,iphone,objective-c,Ios,Iphone,Objective C,我有一些关于代码设计的问题。这可能需要很长时间。我会尽可能缩短它 Q1)依亲还是独立? 创建一个类并添加所需的功能,以便允许对象更改其自身的状态,而不是控制器(又称viewcontroller)正在更改的状态 我发现在尝试交流时,代码示例是最好的: 注意:我减少了一些代码行。源代码 无论如何,如果我必须为一个账户设置账户余额,它建议我这样做: @interface BankAccount: NSObject { double accountBalance; long accoun

我有一些关于代码设计的问题。这可能需要很长时间。我会尽可能缩短它

Q1)依亲还是独立? 创建一个类并添加所需的功能,以便允许对象更改其自身的状态,而不是控制器(又称viewcontroller)正在更改的状态

我发现在尝试交流时,代码示例是最好的: 注意:我减少了一些代码行。源代码

无论如何,如果我必须为一个账户设置账户余额,它建议我这样做:

@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个视图控制器,所有这些控制器协调银行账户的不同视图-一个是分类账,一个是饼图,一个是预算计算器。当应用程序从互联网上请求刷新银行账户信息时,当该请求返回时,它可以立即通知所有三个视图控制器,它们可以相应地刷新视图。当你有一个以上的对象想要知道发生了什么事情时,它就真的被使用了

希望这有帮助,如果你有任何疑问,请告诉我