App架构相关经验体悟

参考

本文旨在总结一些在不对现有项目结构做出重大调整的情况下,逐步改善代码质量及可维护性的方式。

指导思想

将应用程序的各种功能和系统按其职责和关注点明确区分。

目的

我们发明各种架构模式,技术和原理的最终目的都是为了引导我们编写更清晰解耦,易于维护的代码。

Container view controller

视图控制器大量增长的问题在于它们有太多的责任:管理视图,执行布局和处理事件,还要管理网络,图像加载,缓存和许多其他事情。

减少增长的一种方法是将它们分成多个,每个视图控制器负责一个较小的责任区域,然后由一个容器视图控制器控制。

  • 内容视图控制器可以专注于布局和渲染特定状态
  • 容器视图控制器负责加入和移除内容视图控制器,以及各种内容状态之间的转换
  • 这样还有一个好处是UIKit会负责将所有标准UIViewController事件自动发送到子视图控制器

通过嵌套视图控制器,通常最终会使用更加模块化,更简单的实现。

Logic controller

一般来说,想要将大的类型分解为多个部分,可以采用两种方法 - 组合和提取。

上面使用容器视图控制器就是使用组合的方式,但只是这样不能解决所有问题,有些情况还可能增加很多复杂性却只有很少的收益。这种情况下,将功能提取到单独的专用类型可能是更好的选择。

提取,就是将大型部件拉出成一个与原件紧密结合的独立类型。这种方式在各种架构模式很常见 - 比如MVVM,引入View Model类型来处理大部分Model-> View的转换逻辑。

还有一种可以保持MVC模式的简单方法是将视图控制器拆分为视图部分控制器部分

  • 一个控制器保留UIViewController子类和所有与视图相关的功能
  • 另一个控制器与UI分离,专注于处理各种逻辑
  • 视图控制器不需要知道其状态是如何加载的,只使用逻辑控制器提供的状态并进行渲染

Self-Manager模式

即赋予一个View更大的权利,让其自己负责自己的所有事件与逻辑。

对于外部使用者来说,只需要简单的传递必要的依赖即可,完全不需要关心和插手任何逻辑。

对于复杂的视图控制器来说,能提取出部分模块进行自管理,甚至复用,可以明显让对应逻辑更清晰,简单。

Model controller

大多数应用程序包含许多不同类型的模型,通常可以分为两类 - 共享的和本地的。

其中共享模型会在许多不同模块中使用,而且通常都会出现一些共享的逻辑。

如果将这些逻辑放在某种形式的单例或全局函数中,通常会损害我们的代码封装,但是直接放到模型中又会很奇怪,因为大多数设计模式都同意的一件事,理想情况下的模型应该是不怎么包含逻辑的简单数据容器。

这个时候可以引入模型控制器,执行模型单个实例相关联的所有逻辑 - 让我们正确地封装模型特定的逻辑:

  • 进一步控制和隐藏敏感信息,防止被外部错误使用和修改
  • 单一专用代码路径,可以完全单元测试,消除重复逻辑和不一致的风险

合理的依赖注入

要使代码更易于测试时,依赖注入是一个必不可少的工具。

不是让对象创建自己的依赖项或将它们作为单例访问,而是认为对象需要的所有内容都应该从外部传递。

这样既可以更容易地查看给定对象具有哪些确切的依赖关系,还可以使测试变得更加简单 - 因为可以通过模拟依赖关系来捕获并验证状态和值。

尤其是对象内部直接使用单例时,不仅难以测试,而且2者之间可能会产生不明确的关系。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容