Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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
创建Objective-C对象的最佳编程实践是什么?_Objective C_Parameters_Messages_Nested - Fatal编程技术网

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

创建Objective-C对象的最佳编程实践是什么?,objective-c,parameters,messages,nested,Objective C,Parameters,Messages,Nested,我正在学习Objective-C,作为课程之一,我们创建一个类Employee及其超类Person,以及一个资产类,其实例由Employee拥有。为了测试这些类及其实例函数,我编写了以下代码 int main(int argc, const char *argv[]){ @autoreleasepool{ NSMutableArray *employees = [[NSMutableArray alloc] init]; for (int i = 0; i < 10; i

我正在学习Objective-C,作为课程之一,我们创建一个类Employee及其超类Person,以及一个资产类,其实例由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 */
  }
} 
谢谢。

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

当然,您可以单独设置每个属性。为了方便起见,您可以提供特殊的帮助器方法,使在一次调用中设置多个属性变得更容易。这是完全可选的。你是否选择添加这些额外的方法完全是个人品味和风格的问题

此类辅助方法的一个考虑因素是在何处划线。哪些属性应该是此类方法的参数?如果以后添加另一个属性,会发生什么情况?是否更新helper方法以获取另一个参数,然后更新所有调用这些方法的代码


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

您忽略了显示如何定义Employee对象。体重、身高和身份是否作为财产持有?如果是这样,它们通常会自动生成访问器方法,因此您不需要编写这些例程。物业有很好的便利性

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


通常会有一个初始值设定项来接收要初始化的对象的信息,但是像这样的东西-iditwithweight:和height:andId:和somethingelse:和morething:比我把它展开的时间要快得多。要解决此问题,NSDictionary类可能会很有帮助,其中dictionary包含您选择包含的所有字段,并且方法变为-idinitUsingDictionary:NSDictionary*dictionary;。这样做的一个好处是,您可以轻松地将字段设置为可选字段,并使用单个方法签名进行处理。

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

这里有几个选项:

在init上设置这些参数,例如initWithId:height:weight: 为它们中的每一个创建属性 为它们中的每一个创建单独的函数 创建setProperties函数 要决定这一点,你首先应该问自己:

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

如果需要在创建对象后立即设置该信息,请使初始值设定项将其作为参数。
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];
        }
....