【问题标题】:Is it right having ViewControllers with a lots of code?拥有大量代码的 ViewController 是否正确?
【发布时间】:2012-01-16 15:53:26
【问题描述】:

我对 Cocoa 和 Objective-C 还是很陌生(

我的问题是:有一个“大”的 ViewController 是否可以,或者是否有将代码拆分为分数的模式?很多代码都在实现委托方法,这就是为什么我不知道如何将其移走。

我知道,不过我可以使用语用标记进行结构化。

感谢您的任何意见。

编辑(2013 年 12 月):关于这个主题,objc.io 有一个 great article from Chris Eidhof。他还在 Macoun 2013/Frankfurt 上谈到了这个话题。分离 UITableView 协议是一个很好的模式。

EDIT2 NSScreencast 上还有 2 个视频解释重构 ViewController 的概念(第 102 和第 103 集)。

【问题讨论】:

  • +1 好问题。很高兴知道有人在乎。
  • 感谢所有答案 - 非常感谢!不过,选择“正确”的答案几乎是不可能的。对于我自己,如果已经确定,我在将模型代码从 VC 中分离出来时不够严格。但我也会学习类别的概念。

标签: iphone objective-c ios cocoa-touch design-patterns


【解决方案1】:

我见过的大型视图控制器的最常见原因之一是 MVC 架构中缺乏黑白模型和控制器的分离。换句话说,您是否在视图控制器中处理数据?

如果是,则从 VC 中取出模型组件并将其放入单独的类中。这也将迫使您思考更好的设计。

供参考,在视图控制器中:

  • 处理 UIView 和其中包含的 UI 元素中的所有更改。
  • 所有动画、过渡和 CALayer 操作。

在模型中:

  • 数据的所有处理,包括排序、转换、存储等。

【讨论】:

    【解决方案2】:

    恕我直言,700 行代码对于 iOS 代码来说(还)不是很大,我见过并处理得更糟。当然,如果你所有的 VC 都这么大,那你就有问题了。

    您绝对应该使用和滥用#pragma mark,它至少在 Xcode 下非常有用。

    然后,如果您发现一个文件中有太多代码,您可以将功能提取到类或类别中,以更好地适应。

    从长远来看,创建类可以非常有益地管理项目中的重复任务(即连接到 Web 服务、解析 XML/JSON、与 SQLlite 交互、日志记录等)。如果你在做经常性的 iOS 编程,你可以用这种方式创建一个“通用”的有用代码库。

    创建类别,尤其是在UIViewController 上可以帮助减少占很多位置的样板代码。您还可以(并且可能应该)为您的应用创建一个公共基础 UIViewController,它将在代码的集中部分处理旋转、日志记录、导航等内容。

    【讨论】:

    • 没错,我有一个1300行的VC,而且还不错,因为大多数行只是自定义动画等。我认为这取决于该类具有什么样的方法和依赖项.
    【解决方案3】:

    您应该尝试确定您的 ViewController 真正在做什么。

    如果您可以分离一些关注点,您可以将它们移动到自己的类中。找出 viewControllers 方法使用了哪些属性和 ivars。如果您可以找到使用 ivars/属性的公共子集的函数子集,那么它们很可能会成为它们自己的类。然后控制器将拥有这样一个新类并将工作委托给它。

    如果您的 ViewController 正在管理某种状态,例如。您在 2 种或更多方法中发现相同的 switch 语句或 if-chain 状态模式可以使您的 VC 更具可读性。但基本上你可以使用任何有助于减少 VC 责任的模式。

    恕我直言,ViewController 是您将模型连接到视图的地方。将模型更改传播到视图并处理用户与视图的交互是唯一应该发生的事情。所有其他职责,如计算、网络传输、解析、验证……都应该发生在 VC 使用的不同类中。

    您可能会喜欢 Robert C. Martin 的 Clean Code 一书。他深入探讨了如何构建代码以提高其可读性和可重用性。

    【讨论】:

      【解决方案4】:

      【讨论】:

      • 虽然这可能会提高代码的可读性,但它不会提高可重用性,也无助于分离关注点。如果您可以将 VC 拆分为自然不同的类别,为什么不将其拆分为不同的类别?
      • 将代码分成类别的全部意义在于方法成为类类型的一部分。分成不同的类是一个完全不同的概念。如果代码非常大,最好将其分成几类。
      • 是的,我知道,我明白你的意思。而且我同意最好将其分类,然后就这样离开它。但最好的方法是创建单独的类。每个类都获得完成工作所需的属性。将代码分成多个类别会导致一个大类,它具有多种职责。这导致MAGIC PUSHBUTTONGOD OBJECT
      【解决方案5】:

      更喜欢使用 NSObject 类来管理部分视图控制器功能。代码更清晰、更容易调试的主要原因

      【讨论】:

      • 想详细说明一下?我不知道你在这里建议什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多