拆分代码与泛型

清醒疯子 发布于 2015年08月20日 | 更新于 2015年08月20日
tinyfool 等1人欣赏。

递减,用尽一切潜力的秘密。

社会的发展,人们对软件有了越来越多的期待。为了更快更好的把APP开发出来,开发者们越来越重视代码的可测试和可复用。开发者们把优良实践经验总结成各种设计模式。而软件架构的设计与开发,也是以此为根本出发点。

我们知道,MVVM也好,VIPER也罢,目的只有一个,把VC的代码分拆,使代码更容易测试和复用。

那么,抛开各种先进设计不谈,我们来聊聊代码分拆的基本做法是怎样的。

类内的代码拆分

1、把一个方法里的部分代码移到新建方法中。

2、根据所移代码,在方法名里补充需要的参数。

3、在代码原来的地方引用新建的方法。

至此,完成了文件内的代码拆分。后面我们尝试把方法移出文件。

代码分离到新类

4、新建一个类,把之前新建的方法移到新类中,在头文件把方法名加上作为对外接口。

5、在旧类中创建一个新类的对象。

6、把旧类中引用新方法的地方里的"self",改为新类对象。

至此,完成了代码从一个类移动到另一个类。

原始的“换类不改类”

如果我们希望修改方法实现的功能,怎么办?

按传统做法,在旧类里直接改。把代码从旧类移到新类后,只需要修改新类,旧类无需修改。这在某种程度上实现了模块化。

但是,不管在旧类上改代码,还是在新类上改代码,只要改变原类代码,就破坏了每个类原有的“单一职责”。随时业务需求的变化,一个类不断修改代码,这个类的“职责”也就一直在变化。

我们希望每个类都有它自身的“单一职责”,在我们需要其它“职责”时,创建新的类,而不是去破坏旧的类,使其身兼数职或职责不断在变化。

于是,新的需求就应此而生:通过换类来实现功能的修改,而不是改类。

我们先创建第二新类,提供接口,并实现功能的修改。在旧类里创建第二新类对象。然后,把调用第一新类方法的地方,把第一新类对象改为第二新类对象。

至此,完成了最原始的“换类不改类”。

泛型,实现类职责的永久单一

随着功能的扩展,如果继续沿用上面的设计,我们在不得不在旧类上创建大量的新类对象,同时还得把旧类中引用的新类对象方法的地方一一找出并修改。

为了彻底做到“不修改旧类代码即可修改功能”的设计目标,我们对代码的设计进一步优化。

7、创建一个协议。

8、在旧类中创建一个协议对象 (id)。把旧类中调用新类方法的地方全部改为调用协议对象方法。

9、创建一个符合协议的新类。在协议新类的协议方法里完成旧类功能的实现。

10、在旧类实例化的地方,把协议新类实例化,赋给旧类的协议对象。

11、把旧类引用新类对象方法的地方,改为引用协议对象方法。

12、以后需求变化,修改功能,只需要把第二协议新类实例化后,赋给旧类的协议对象就可以。其它任何地方的代码全都无需改变。

这样就可以把一个类的变化部分,彻底分离出来,让一个类的职责永保单一。

后记(下面以聊家常为主,没时间没兴趣的朋友请直接忽略):

递减原则

昨天,发布了《从零开始学iOS开发的15条建议》,最开始只是为了避免有人重复问我“怎么自学iOS开发”这个问题。

今天,我完成了6组共300个仰卧起坐。在健身的时候,因为越做到后面的组别时,保持每组50个越来越困难,使得不敢轻易开始新的一组。那么,我少做一组就少做50个。如果我没有一组做50个的规则,那么我将可以非常轻松地多做10个。

由此可见,“定量思维”会极大的降低人的潜力。“倒金字塔”或“递减”思维,更有利于把潜力榨光。

《15条建议》里,项目、源码、书籍、博客、文档、视频、社区、搜索、Q群,这样由难而易的学习顺序,明显就是一种“递减思维”。递减式的学习顺序可以适合所有人。任何人按着这个顺序来,永远有事可做。而递增式的学习顺序则会让有积累的人感到超级无聊。

所以我应该改变我的健身组合,一开始尽可能地多做,然后每次根据当下的情况递减,理想情况是递减到1个都做不下。

同样的,不管我做任何事,都应该用“递减原则”代替“递增原则”,让自己和世界的潜力得到最大的互动。

我们对待儿子的方式,就是递减式的。从来不会只在对应年龄段给儿子找书看,而是先把书丢给他,如果他看得吃力或不感兴趣,再换一本低一年龄段的。

我将通过“递减原则”全面改造我现在第138版的人生系统:《疯子一般深入系统》。

共3条回复
尼克徐 回复于 2015年08月20日

建议你写的时候,以代码实际例子结合理论。这样看起来就不枯燥了。

如果一次写不完,可以PART 1, PART 2,这么连载下去。

amosji 回复于 2015年08月20日

写的好。
在设计一个类的时候,是应该遵循开闭原则

初心泽 回复于 2015年08月20日

赞同1楼, 顺便支持楼主, 从初学到写了一年回头看自己的项目,真是太不规范了 T T, 学习!

登录 或者 注册