代码与代码之外

Code and Beyond

软件工程的演进:从模块化到设计模式

半个世纪之前开始有了软件工程,一开始大家强调模块化,于是能满足模块化要求的结构化编程语言大行其道。同行们都知道吧?

模块化的编程目标引出了软件质量的两个重要衡量标准:高内聚,低耦合,时至今日各种方法论泛滥的今天仍然是最重要的质量标准。同行们也都知道吧?

即使没学过软件工程,读过一点编程书或者上过一点编程课也不难接触这些概念,而且这些概念也是各种论坛什么的常见的关键字,在下就不必多言了。

下面和大家一起复习设计模式的基本原则,共七条:单一职责原则、开放封闭原则、里氏代换原则、接口分离原则、依赖倒置原则、组合复用原则、迪米特法则。前五条的首字母组成了著名的简写:SOLID 原则,后面两条也非常重要但它们往往体现在前五条的延伸。学术定义大家可以善用搜索引擎或书本,极容易找全。

单一职责原则怎么实现?每一个模块都只有一个职责要做,要少写功能,少即是多!功能多怎么办呢?组合!

开放封闭原则重点是?变化无处不在,不要狂妄的把逻辑或模块写死,策略上的迂回是必要的!

里氏代换原则主要是针对继承式复用,类抽象就是为了你不要无聊的改来改去!尽量复用父类的功能或者复用父类功能的组合,不能复用的父类是不合格的。

接口是模块与模块之前的交点,接口分离原则依赖接口语义必须有不变性的保证,然后模块与模块之前才可以稳定的组合起来实现职责的分离。

依赖倒置原则是与迪米特法则最有共鸣的,目标是以最小的知识成本来完成目标,从这个角度审视细节的话其实很多是不必要的。

正交设计可能是许多人比较陌生了或者掌握不太清晰的概念,以我观察,包括我在内也很少人有正交四原则的概念。

正交即数学上讲的是平面上的两个垂直线段,其中一个线段变长或减短或者转圈圈,另外一根是不变的也不影响它们的垂直度的。软件工程上推演为两个只有交叉点而互不影响的模块,它们有更高的内聚和更低的耦合,这个交叉点即我们熟悉的接口。满足正交性的系统有更好的可重用性,只要保证接口主义不变,两个模块可以独立演进。如果把平面扩展到多维空间,可以继续做出互相垂直的模块而不影响现有模块的正交性,即可以有多个模块使用现在有模块的语义不变的接口而不必过度关心上下层互相绑架的情况的发生。

关于正交设计四原则,摘录某大牛博文如下:消除重复、分离关注点、缩小依赖范围、向稳定的方向依赖。具体内容不解释,大家请自觉搜索。

我认为四个原则是软件工程的推导或设计原则的总结:消除重复体现了内聚性也总结了单一职责和迪米特法则、分离关注点是整个模块化思想的延伸、缩小依赖范围体现高内聚、向稳定的方向依赖简直是接口分离原则换了一个说法。

孰重孰轻我无法下结论,能融会贯通是最好的,最好的状态是你不需要刻意去一条条代入而实现了非常简洁合理的系统。


2016-10-30 深圳

搜索关键词:模块化,高内聚低耦合,正交四原则,设计模式七原则。