软件设计,那些你不知道的事

代码质量和产出是衡量一个程序员是否优秀最直接的标准。如何提高代码质量和产出?这就要从软件重构和review入手。市面上有很多关于重构和review的书籍,但是看完之后,代码能力并不能立竿见影显著提升,只能帮助我们解决表面的bug和规范点,无法帮助我们发现更深层次的设计问题。

从设计角度来考虑review,识别代码坏味道可以可以有效减少技术债务。技术债务是指有意或无意的做出错误的或非最优的设计决策所引发的债务。债务越积越多,最后只能重新彻底重构项目才能解决问题,这也叫做技术破产。如何解决技术债务问题,就要从根源上明确引起技术债务的重要的原因——设计坏味和重构认识不足。

首先要明确软件设计原则

  • 抽象原则:通过精简和概括来简化实体:精简指的是删除不必要的细节,概括是找出并定义重要的通用特征。

  • 非循环依赖原则:包之间的关系不可形成循环。

  • 不自我重复原则:在详细设计中,设计实体和代码和重复可能表现为类型名重复和实现重复。

  • 封装原则:通过隐藏抽象的实现细节和隐藏变化等方法实现关注点分离和信息隐藏。

  • 信息隐藏原则:找出棘手或可能变化的设计决策,并创建合适的模块或类型来对其他模块或类型隐藏这些决策。

  • 保持简单原则:简洁是软件系统设计的重要目标,应避免引入不必要的复杂性。

  • 里氏替换原则:所有的子类型都必须至少提供超类型承诺的行为且对每个超类型的引用都可替换成子类型实例。

  • 层次接口原则:使用分类、概括、替换、排序等方法以层次方式组织对抽象。

  • 模块化原则:通过集中和分解等手法创建高内聚、低耦合的抽象。

  • 开闭原则:类型应对扩展开放,对修改关闭。具体是模块应该能够在不修改代码情况下支持新需求。

  • 单一职责原则:绝不应有多个导致类需要修改的原因,如修改一个成员可能影响类的其他不相关职责,导致类难以维护。

  • 变化封装原则:倡导一种信息隐藏方式,建议将可能发生变化的概念封装起来。很多设计模式都体现了这种设计原则,如策略模式、桥梁模式、观察者模式。

我们从设计的角度来看代码时,要遵循六要素:

软件设计,那些你不知道的事

了解完设计原则和六要素后,我们再来看设计坏味。

软件设计,那些你不知道的事

本文中每种坏味我们只选其中一例做具体说明。

抽象型坏味

抽象原则倡导通过精简和概括来简化实体:精简指的是删除不必要的细节,而概括指的是找出并定义通过的重要特征。交通标志是用于交流的抽象示例,而数字符号和编程语言是用于解决问题的抽象示例。

软件设计,那些你不知道的事

缺失抽象

使用一系列数据或者编码字符串,而不创建类或者接口时会产生这种坏味

  1. 概念

  • 应用抽象原则的一种实现手法是创建概念边界清晰,身份唯一的实体。由于没有创建抽象来表示实体,而是使用基本数据类型或编码字符串等原始数据来表示它,这违反了抽象原则,将这种坏味称为缺失抽象(Missing Abstraction)。不必要的抽象也违反了模块化原则。

  1. 潜在原因

  • 未做重复的设计分析

  • 未重构

  • 错误的将重点放在细微的性能改善上

  1. 示例

  • 在JDK1.0中方法printStackTrace()以字符串的方式将栈跟踪打印到标准错误流。

  • 在需要以编程方式访问栈跟踪元素的客户程序中,必须要编程代码来获取数据,如行号等,由于客户程度依赖这种字符串格式,JDK设计人员只能在后续版本中兼容这种格式了。

软件设计,那些你不知道的事

软件设计,那些你不知道的事