【问题标题】:How do I bring DRY (don't repeat yourself) to Objective-C我如何将 DRY(不要重复自己)带到 Objective-C
【发布时间】:2009-07-31 21:48:45
【问题描述】:

我正在从 Ruby 转向 Objective-C,并且我一直在做:

NSObject *foo;

@property (nonatomic,retain) NSObject *foo;

在 .h 文件中,然后在 .m 文件中:

@synthesize foo;

在顶部和

[foo release]

在dealloc中。

添加foo只需4步!经验丰富的 Objective-C 程序员是否每次想要向类添加新的实例变量时都手动执行所有四个步骤?我错过了一种使这个干燥的方法吗?

【问题讨论】:

  • 感谢 ARC 和自动属性,您现在也可以摆脱这些了!其余的并不是真正的 un-DRY,它只是丑陋,就像 Objective-C 的很多东西一样。

标签: objective-c properties dry


【解决方案1】:

这也是 C++ 中的一个常见问题(声明加倍,尽管它确实有点不同)。简短的回答是,这就是语言的构造方式。它并没有真正违背 DRY,因为每个语句都是独一无二的并且有自己的目的。然而,按照今天的标准,它无疑是非常冗长的。

【讨论】:

  • 庆幸你没有写 getter 和 setter...把它想象成 more DRY 比替代品!
  • 像所有语言一样,objective-c 中的一些东西很有趣,而另一些则是苦差事。
  • @ben 实际上,如果你编码得当,你就没有 setter、getter 或属性——但大多数人的编程都不是很好(我应该说你没有 setter 和你的吸气剂相对较少)
  • @Ben,如果您使用 C#,这并不难:public string Foo { get; set; } ...
【解决方案2】:

此页面http://pragprog.com/magazines/2010-07/not-quite-new-in-ios- 声称,您可以删除变量声明,将其减少到仅重复 2 次 :)

#import <UIKit/UIKit.h>
@interface MoveMeViewController : UIViewController {
}

@property(nonatomic, retain) IBOutlet UIImageView *imageView;
@end

【讨论】:

    【解决方案3】:

    既然您提到您是 Objective-C 的新手,我想确保您知道您不必为类中的每个实例变量创建属性,事实上您可能不应该.

    属性表示您的类为其他类提供的接口。这个接口不一定与类的内部实现相匹配。在它们相同的情况下,声明的属性语法使表达它(相对)简单。

    如果您的类通过属性公开其大部分内部状态,您可能需要仔细查看它们的设计,以及是否可以通过移动职责来获得更简单的设计。

    【讨论】:

      【解决方案4】:

      Objective-C 是 C 之上的一个非常薄的层。在低层次上,大多数“Objective”内容编译为注入 C 编译过程的代码指针。

      他们确实添加了引用计数(最基本的垃圾收集系统),但由于它的性质,这一切都是手工完成的,因此“释放”调用。

      非 iPhone 版本添加了一个真正的垃圾收集系统,但这些系统也没有缩减,因为释放不是确定性的。

      保持你的对象小而专注,属性语法不应该是非常具有侵略性的。

      【讨论】:

        【解决方案5】:

        是的,我愿意,但我希望每天都有人想出一个脚本或其他东西让 XCode 自动化这件事。 (我也更喜欢

        self.foo = nil 
        

        在我的交易中)

        【讨论】:

        • Apple 有充分的理由建议不要在 init 和 dealloc 中使用 setter 和 getter。一方面,对象在 init/dealloc 期间定义不完整(尤其是在子类化的情况下),因此调用其他方法(包括 setter/getter)可能会导致不正确的行为。考虑设置器被覆盖或另一个对象观察属性的情况。
        • 你能给我指出那篇文档吗?很难与文档更新保持同步。
        【解决方案6】:

        一旦忘记了 32 位计算机,您就不必同时声明实例变量和属性,因为 64 位运行时可以合成实例变量。但是在必须在头文件中声明并在另一个文件中实现的语言中,您不能完全干燥。语言需要重复。唯一的办法是创建一种元语言。

        您可以使用脚本来消除一遍又一遍地键入相同变量样板的重复,但它仍然会存在于代码中。

        顺便说一句,我不认为@synthesize 语句是重复信息。您的代码中没有其他内容表明使用哪些访问器来获取该属性。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-11-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-03
          • 1970-01-01
          • 1970-01-01
          • 2013-05-07
          相关资源
          最近更新 更多