创建Objective-C对象的最佳编程实践是什么?

时间:2014-04-18 19:49:42

标签: objective-c parameters messages nested

我正在学习Objective-C,作为课程之一,我们创建了一个类Employee,它的超类Person,以及一个Asset类,其实例由Employee拥有。为了测试类及其实例函数,我编写了以下代码

int main(int argc, const char *argv[]){
@autoreleasepool{
    NSMutableArray *employees = [[NSMutableArray alloc] init];

    for (int i = 0; i < 10; i++){
        Employee *person = [[Employee alloc]init];
        [person setWeightInKilos:90 + i];
        [person setHeightInMeters:1.8 - i/10.00];
        [person setEmployeeID:i];

        [employees addObject:person];
    }

    .../*code continues from here, to assign [person]
          's  at random indexes in *employees, instances of the Asset class */
  }
} 

我想知道setting [person]使用一种方法有什么好处或坏处,后者又会调用其他方法,如下所示:

main.m:  
....
for (int i = 0; i < 10; i++){
            Employee *person = [[Employee alloc]init];
            [person setWeightInKilos:90 + i withAHeightOf:1.8 - i/10.00 andId:i];
            [employees addObject:person];
        }
....

感谢。

3 个答案:

答案 0 :(得分:0)

您的Person课程有多个属性,包括weightInKilosheightInMetersemployeeID

当然,您可以单独设置每个属性。为方便起见,您可以提供特殊的“帮助”方法,以便在一次调用中更轻松地设置多个属性。这是完全可选的。您是否选择添加这些额外的方法完全取决于个人品味和风格。

这种“帮助”方法的一个考虑因素是绘制线的位置。哪些属性应该是这些方法的参数?如果您以后添加另一个属性会怎样?您是否更新了“helper”方法以获取另一个参数,然后更新调用这些方法的所有代码?

在许多情况下,最好单独设置每一个。我用于决定是否创建这样的“帮助”方法的一个准则是,如果对象需要将某组属性设置为有效。如果存在这种情况,那么我通常会创建一个特殊的init方法,该方法将所需的属性作为参数。然后可以单独设置所有可选项。

答案 1 :(得分:0)

您忽略了如何定义Employee对象。 weightheightidentification是否属性?如果是这样,它们通常会为它们自动生成存取方法,因此您不需要编写这些例程。属性具有很好的便利性。

至于为什么你会使用一种方法而不是另一种方法,最引人注目的原因是个人风格。需要考虑的事项 - 如果你选择改变一个人的存储重量会发生什么;你有一个方法只设置那个参数,还是你需要设置它们的所有内容?

有一个初始化程序可以接收有关某个对象的初始化信息,但像- (id)initWithWeight:andHeight:andId:andSomethingElse:andMoreStuff:这样的东西比我把它拉出来的要快得多。要解决此问题,NSDictionary类可能会有所帮助,其中字典包含您选择包含的所有字段,方法变为- (id)initUsingDictionary:(NSDictionary *)dictionary;。一个很好的好处是你可以轻松地使字段可选,并且单个方法签名处理它。

答案 2 :(得分:0)

基本上这里没有任何对与错,objective-c语法和编码约定允许你有多个参数的长消息。

这里有几个选项:

  1. 在init上设置这些参数(例如initWithId: height: weight:
  2. 为每个人创建一个属性
  3. 为每个人创建单独的功能
  4. 创建setProperties函数
  5. 要做出决定,首先应该问问自己:

    1. 这些三胞胎(身高,体重,身份证)是否在逻辑上属于一起?
    2. 只设置其中一个是否有意义?
    3. 这个对象缺少这些值是否有意义?
    4. 是否需要将这些参数设置为原子操作?
    5. 对象的不变性是否重要?
    6. 大多数时候我选择让我的对象不可变,这意味着我为它们创建了一个只读属性,并通过init函数设置它们。