MVC分解原理

iOS社区一直在寻找一种统一的架构来统治一切。 不幸的是没有。

为什么我要写这个。

我在专业项目上使用了MVCMVVMMVPVIPER等各种架构。 然后,我在寻找再次创建健壮的应用程序的正确方法。 有一天,我看到了由Guilherme Rambo创建的这个很酷的网站。 然后我开始思考,也许问题不在于架构。 也许我们的观点是问题所在。 因此,对于下一个项目,我决定选择MVC 。 在这篇文章中,您将了解这种方法。

问题

有关WMVC(错误的MVC)的主要问题是职责分配不平衡。 控制器几乎可以执行所有操作。

  • 联网
  • 资料解析
  • 商业逻辑
  • 动画制作
  • 布置视图
  • 用数据更新视图
  • 响应用户输入
  • 导航

因此,它很难测试,难以维护,难以修复。

UIViewController不是屏幕。 这是一个组成部分。

您可以在一个屏幕中使用许多视图控制器。 每个视图控制器都应承担自己的责任。 假设您从服务器加载数据并在屏幕上显示加载状态,然后响应出现,如果您的网络请求失败(总是失败),则在屏幕上显示数据状态或错误状态。 所有这些过程可能由一个视图控制器负责。 我们可以称之为StateViewController。 该视图控制器仅代表三种可能的状态。 您可以阅读John Sundell的这篇文章,以了解如何实现状态视图控制器。 当您需要针对不同屏幕的某些功能时,它非常简单,可以节省大量时间。

让我们来看一个例子。 我想创建一个Netflix细节场景。 我将场景分为如下所示的较小部分。 当然这是一个演示,我只想展示如何在屏幕上分解为较小的组件。

DetailViewController应该能够由其他视图控制器组成。 像HeaderViewControllerDescriptionViewControllerActionsViewController等一样。这将提供容易的错误修复, 毫不费力地添加新功能,并且为大型控制器编写单元测试比大型视图控制器容易得多。

DismissViewController的责任是显示关闭按钮和火灾关闭事件。
HeaderViewController负责下载图像并将其显示在UIImageView中。 此视图控制器还可以使用另一个视图控制器调用ImageViewController🙂
PlayViewController负责告诉所有者用户确实点击了播放按钮
ActionsViewController基本上是在堆栈视图和触发事件中显示动作。
SegmentViewController是显示段和触发事件
EpisodesViewController是在用户点击情节时在集合视图中显示情节并触发事件
DetailViewController负责布局视图,加载数据并创建子视图控制器以完成其工作。


模型

  • 模型是您的域数据。 这对应于用户使用的所有与数据相关的逻辑。

视图

  • 视图应该很小。
  • 视图应该是可重用的。 创建新视图时,它应该能够作为子视图重用。
  • 视图应该是可组合的。 我们应该能够从库存清单中存在的视图中创建一个新视图。

控制者

  • 控制器应该很小。 应符合单一责任主体
  • 控制器应该是可重用的。 当您需要某个地方时,您应该可以使用相同的控制器。 例如ImageViewController。 它下载图像并将其显示在图像视图中。
  • 控制器应该是可组合的。 例如,如果您有ImageViewControllerTitleViewController,则应该能够使用它们创建ProfileHeaderViewController
  • 控制器应为黑匣子 。 如果您的控制器需要数据,则应询问所有者。 如果发出事件,则应通知所有者。 就这么简单
  • 控制器应仅显示数据或子级 。 如果您有ProfileViewController,它将加载数据并显示子级,例如ProfileHeaderViewController,ListViewController等。在这种情况下,ProfileViewController会显示子级。 ProfileHeaderViewController显示数据。 这很重要,当您遵循此规则时,使用WMVC方法就很难了。
  • 管制员不应该知道外部世界。 您不应该编写类似navigationController.push(vc,animation:true)的代码。 这是 协调员 进来的 地方 。Soroush Khanlou 建议 。 您也可以通过提供的Apple检出控制器。
  • 控制器可能并不总是具有视图或模型。 例如NetworkController os StorageController,UserSessionController等。

结论

当您要创建软件时,记住SOLID,KISS,DRY原则很重要。 如果没有必要,不要在其中划分太多小部分,这样您将不会理解自己的代码库。 当有人看代码时,它应该是可以理解的。 如果您不理解代码,那么该进行重构了。

您可以立即开始重构自己的代码。 只需要一段代码并将其分开。 就这么简单。

如果您想了解更多信息,Paul Hudson,John Sundell,Soroush Khanlou,Dave Delong和Joachim Kurz会提供有关MVC的非常好的会议演讲和博客文章。