【问题标题】:What is the best programming practice for creating an Objective-C Object?创建 Objective-C 对象的最佳编程实践是什么?
【发布时间】:2014-04-18 19:49:42
【问题描述】:

我正在学习 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];
        }
....

谢谢。

【问题讨论】:

  • 如果需要在创建对象后立即设置该信息,请让您的初始化程序将其作为参数。

标签: objective-c parameters messages nested


【解决方案1】:

这里基本上没有对错之分,objective-c 语法和编码约定允许您拥有带有多个参数的长消息。

这里有几个选项:

  1. 在初始化时设置这些参数(例如initWithId: height: weight:)
  2. 为每个人创建一个属性
  3. 为每个函数创建一个单独的函数
  4. 创建 setProperties 函数

要决定这一点,您应该首先问自己:

  1. 这些三元组(身高、体重、身份证)在逻辑上是否属于一起?
  2. 只设置其中一个有意义吗?
  3. 此对象缺少这些值是否有意义?
  4. 是否需要将这些参数设置为原子操作?
  5. 对象的不变性重要吗?

大多数时候我选择让我的对象不可变,这意味着我为它们创建一个只读属性,并通过 init 函数设置它们。

【讨论】:

    【解决方案2】:

    您的Person 类具有多个属性,包括weightInKilos、heightInMeters 和employeeID。

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

    这种“辅助”方法的一个考虑因素是在哪里画线。哪些属性应该是这些方法的参数?如果您稍后添加另一个属性会发生什么?您是否更新“辅助”方法以获取另一个参数,然后更新所有调用这些方法的代码?

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

    【讨论】:

      【解决方案3】:

      您忽略了如何定义Employee 对象。 weight、height 和 identification 是否作为财产持有?如果是这样,它们通常会自动为它们生成访问器方法,因此您无需编写这些例程。属性具有与之相关的很好的便利性。

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

      通常有一个初始化程序来接收要初始化的关于对象的信息,但是像- (id)initWithWeight:andHeight:andId:andSomethingElse:andMoreStuff: 这样的东西在我展开它之前就变得丑陋得多。为了解决这个问题,NSDictionary 类可能会有所帮助,其中字典包含您选择包含的所有字段,并且方法变为 - (id)initUsingDictionary:(NSDictionary *)dictionary;。这样做的一个很好的好处是您可以轻松地使字段成为可选字段,并且单个方法签名可以处理它。

      【讨论】:

        猜你喜欢
        • 2020-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-17
        • 2013-11-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多