拆分代码与泛型

作者: 利炳根 | 来源:发表于2015-08-20 05:57 被阅读432次

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

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

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

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

类内的代码拆分

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

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

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

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

代码分离到新类

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

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

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

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

原始的“换类不改类”

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

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

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

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

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

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

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

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

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

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

7、创建一个协议。

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

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

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

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

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

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

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

递减原则

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

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

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

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

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

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

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

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

相关文章

  • 拆分代码与泛型

    递减,用尽一切潜力的秘密。 社会的发展,人们对软件有了越来越多的期待。为了更快更好的把APP开发出来,开发者们越来...

  • 008-自定义泛型,Collections

    自定义泛型 泛型类 代码实现 测试 泛型接口 代码实现 泛型方法 代码演示 测试 泛型上下边界 Collectio...

  • 泛型依赖注入

    泛型依赖注入 1.定义泛型 Java代码: 2.实现基类,声明泛型 Java代码: xml代码:

  • 【第7篇】TypeScript泛型的案例代码详解

    1、最简单泛型例子 Ts代码 Js文件 2、泛型类型与接口 Ts代码一 Ts编译js代码一 Ts代码二 Ts编译j...

  • 唬人的Java泛型并不难

    泛型 上面的代码有什么区别? 泛型初探 1、为何引入泛型? Java 泛型也是一种语法糖,使用泛型可以在代码编译阶...

  • 泛型、型变与投影

    简单泛型 kotlin 对于简单泛型的支持与java类似, 可以通过通配符,提升代码的灵活度 限定型泛型 在编码实...

  • 如何深入理解Java泛型

    一、泛型的作用与定义 1.1泛型的作用 使用泛型能写出更加灵活通用的代码泛型的设计主要参照了C++的模板,旨在能让...

  • Swift探索( 九): 泛型

    一: 泛型 1.1 什么是泛型 泛型可以将类型参数化,提高代码复用效率,减少代码量。 1.2 泛型解决的问题 下面...

  • 【The Java™ Tutorials】【Generics】8

    泛型信息只存在于代码编译阶段,在进入 JVM 之前,与泛型相关的信息会被擦除掉。 引入泛型的目的:Generics...

  • 14 泛型

    14.1 泛型与集合 JDK1.5增加了泛型支持。增加泛型后的集合,可以让代码更加简洁,程序更加健壮。Ja...

网友评论

  • Cpan_mac:不错,以后多交流啊。
  • Kevin丨Wang:喜欢这种鸡汤型技术文,既分享技术又授人以鸡汤 :+1:

本文标题:拆分代码与泛型

本文链接:https://www.haomeiwen.com/subject/dgrgqttx.html