博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 代码的Taste(品位)
阅读量:3884 次
发布时间:2019-05-23

本文共 1438 字,大约阅读时间需要 4 分钟。

最近看了不少代码,想起写代码有意思的地方之一在于,实现同一个 feature,修复同一个 bug,不同程序员可以写出风格迥异的代码,甚至流程也不同,虽然最后都可行,从结果论的角度对用户来说是一致的。我们可以称这种差异为个人 taste,taste 有好坏高低之分,但有时候如何评定却很难有一个清晰准确的界定标准,一般来说代码是越简单越清晰越容易测试越好,但简单清晰容易测试又是另一个维度的标准,又会产生分歧,真要较真起来可以无穷无尽越扯越远。

我有个小例子,大家可以按自己的经验来分个优劣。

UserSession

只要涉及用户登录的 App,都少不了有个 UserSession 的类,记录和用户相关的一切数据和行为,并在用户登出的时候做销毁。UserSession 是一个一旦创建之后,大部分的业务模块都需要访问的实例对象,其他 class 如何访问 UserSession,或者说 UserSession 如何传递到各个 class,这里面的做法就多了。

问题:ControllerA,ControllerB,ControllerC 都需要访问 UserSession 实例,如何传递?

方式一:构造传递

所有的 Controller 在 init 方法里都传入 UserSession,之后再内部持有一个 strong property,类结构如下图:

如果使用这种方式,所有需要引用 UserSession 的地方都需要以 init 的方式传入,包括 Controller 内部的 View、Presenter 等对象,View 可能还有子 View,层层叠叠以树形结构,UserSession 将出现在每一个相关 Class 的 init 方法之内。

方式二:方法参数传递

Controller 本身并不持有 UserSession 的实例,每个需要用到 UserSession 的方法以参数传入,如下图:

这种方式相较方式一,UserSession 作为每个方法的参数将出现在更多的地方。显然,不持有 strong property 有他的好处,比如不会出现 Controller 无法释放导致 UserSession 也无法销毁的情况。UserSession 和 Controller 之间的依赖关系也更清楚,看 .h 中的方法就一目了然。另外需要测试某个方法的时候,要比较容易,方法的声明里就有完整的 context。

方式三:内部直接持有

Controller 在 .m 文件内部通过另一个 UserMgr 实例来统一获取 UserSession,如下图:

这种方式在 .h 中看不出 Controller 和 UserSession 的关系,在 .m 中通过另一个类(xxxMgr、xxxFactory、xxxService)来获取 UserSession 实例。好处是 .h 文件干净一些,但 .m 中可能各处都有获取 UserSession 的代码,一旦代码量多了之后很难理清 Controller 和 UserSession 二者之间的依赖关系。

以上三种方式我都见到过,不同方式对代码的影响也不同,这是个典型的例子,一个完整 App 里往往有多个类似 UserSession 需要被多处引用的对象,三种方式最后都不会影响功能的正常实现,但在代码阅读维护上存在一些差异。

欢迎大家留言,说说自己项目里的方式,以及支持的理由,秀下自己的 Taste。

转载地址:http://vfkhn.baihongyu.com/

你可能感兴趣的文章
nginx另类复杂的架构
查看>>
Nginx流量复制/AB测试/协程
查看>>
使用NTP服务器完美解决VMware Linux时间无法同步问题
查看>>
机器学习笔记(3)---K-近邻算法(1)---约会对象魅力程度分类
查看>>
机器学习笔记(4)---K-近邻算法(2)---使用sklearn中的KNN算法
查看>>
数据结构——外部排序
查看>>
UNIX网络编程——System V 消息队列
查看>>
信号量、互斥锁,读写锁和条件变量的区别
查看>>
UNIX网络编程——Posix共享内存区和System V共享内存区
查看>>
js循环语句
查看>>
js中时钟的写法
查看>>
js事件冒泡
查看>>
京东金融曹鹏:通过JDD大赛,实现“比你更懂你”的极致价值,让金融更简单,更平等
查看>>
HTML我的家乡杭州网页设计作业源码(div+css)~ HTML+CSS网页设计期末课程大作业 ~ web前端开发技术 ~ web课程设计网页规划与设计 ~HTML期末大作业
查看>>
HTML网页设计期末课程大作业~动漫樱桃小丸子5页表格div+css学生网页设计作业源码
查看>>
HTML学生网页设计作业成品~化妆品官方网站设计与实现(HTML+CSS+JS)共8个页面
查看>>
web课程设计网页规划与设计~在线阅读小说网页共6个页面(HTML+CSS+JavaScript+Bootstrap)
查看>>
HTML期末大作业~棋牌游戏静态网站(6个页面) HTML+CSS+JavaScript
查看>>
XmlValidationModeDetector源码分析
查看>>
解析 xml 为Document
查看>>