如何减少Objective-C代码中的代码重复?

Bil*_*ill 5 cocoa objective-c

我意识到这是一个过于宽泛的问题,但我发现我的Objective-C代码是高度重复的.我认为新的块功能会有所帮助,但我还不能假设我的所有用户都在iOS 4上.

我经常最终得到两个或三个具有许多类似逻辑的控制器.我确实将这个逻辑中的一部分引入了一个公共基类,但是,特别是对于与委托相关的代码,我发现在几个不同的地方出现了非常相似的逻辑,因为它们略有不同.

例如,如果我有一个UITableViewController并且我有几个使用多个相同行的子类,那么我几乎无法继承.如果一个子类添加了一个额外的行(或者多个行和/或如果它们位于表的中间而不是末尾),则索引会中断并且超类中的大多数委托方法不再起作用 - 我必须在子类中重新实现它们.

再一次,我意识到这是模糊的,但是人们必须采用什么样的模式来解决这个问题呢?

谢谢!

Tec*_*Zen 3

您正在使用/思考错误的设计模式。

Objective-C 专门使用委托设计模式来避免子类的激增。属性和相同的方法进入类或有限的子类,而针对每种用途自定义的方法进入委托类。

例如,UITableView 类只关心每个表共有的所有属性和方法。所有自定义都在委托和数据源(这只是另一个委托)对象中进行。UITableViewController 将所有内容都绑定到逻辑视图层次结构中。

如果您发现自己有大量相似的表,则应该创建委托/数据源类的层次结构来处理更改。

请记住,让 UITableViewController 同时作为委托对象和数据源对象只是为了方便,而不是必需的。委托和数据源可以位于一个或两个单独的对象中,这些对象本身可以位于一个或多个类中。

尤其是桌子是高度定制的。每个表处理不同的数据,这些数据在不同的单元格中以不同的顺序显示。这意味着确实没有办法避免编写相对大量的自​​定义代码。

阅读委托设计模式。

更新:

如果子类添加了额外的行(或多行和/或它们位于表的中间而不是末尾),则索引会中断并且超类中的大多数委托方法将不再起作用

在我看来,这就像您将模型逻辑放入 tableView 委托/数据源中。不应仅仅因为添加/删除行或部分而重写这两个委托。行和部分的逻辑应该位于模型对象中,例如核心数据,并且委托应该只关心将模型的逻辑行和部分转换为表视图中的行和部分。在绝大多数情况下,这种翻译可以通过样板文件来完成。任何给定的委托应该能够使用相同的代码显示任意数量的不同逻辑表。

唯一真正的定制点通常是表格视图单元格。即便如此,您最多只能看到每个表的少量更改。

查看带有 Core Data 的 Xcode 模板 tableview 项目。它可以在不更改任何代码的情况下显示大量表格,因为所有更改都发生在核心数据模型层。