正如标题所说,我在 UIViewController 和 UITableViewCell 之间共享相同的逻辑,它们将一些信息发送到服务器并进行一些计算。
我遇到的问题是,随着时间的推移,复制的代码会变大,但我不知道如何分解它,因为这些类是不同的对象,每个函数都调用实例变量。
哪个是重新分解代码的好方法,所以我不必每次都更改相同的代码两次?
正如标题所说,我在 UIViewController 和 UITableViewCell 之间共享相同的逻辑,它们将一些信息发送到服务器并进行一些计算。
我遇到的问题是,随着时间的推移,复制的代码会变大,但我不知道如何分解它,因为这些类是不同的对象,每个函数都调用实例变量。
哪个是重新分解代码的好方法,所以我不必每次都更改相同的代码两次?
重构重复代码的最简单方法是从公共部分中创建一个方法。一个重要的问题是放在哪里。当对象相关时,可以将公共代码放在它们的共同祖先中;当它们不相关时,您可能会考虑创建一个仅包含类方法的辅助类,或者使用您的方法体定义一个 C 风格的独立函数。
如果对象不相关并且您需要使用它们的实例变量,则可能有机会提取公共对象。将复制代码所需的所有公共实例变量连同使用这些变量的代码一起移动到新的公共对象中。如果您从中提取公共部分的原始类中也需要变量,请根据需要添加 getter 和 setter。为提取的类创建一个 ivar,并使用其属性代替实例变量。
您应该为服务器交互创建一个单独的类,如果涉及大量工作,甚至可以创建一个单独的类来处理来自服务器的数据。
根据 Apple 鼓励用于 iOS 开发的模型-视图-控制器设计模式,视图(例如 UITableViewCell)不应该做诸如向服务器发出请求和处理结果之类的事情。相反,您的控制器应该做这些事情并向您的视图提供必要的信息(即模型)。
例如,您可能有一个带有和Server
等方法的类。它可以有一个随附的协议,其中包含一种方法,例如当您从服务器接收信息时。然后,您的视图控制器可以实例化一个对象并将自己设置为委托,然后在委托方法中进行必要的计算。在它向单元格提供一些信息后,您将该信息存储在某处,然后调用以更新单元格。connect
sendData
ServerDelegate
server:didReceiveData:
Server
[tableView reloadRowsAtIndexPaths:...]
在大多数情况下,最好将任何逻辑从UITableViewCell
inclusive移出UIViewController
。Cell 应该只负责显示数据。