Clean Code 读书笔记 -- 11. 系统

348 阅读3分钟

如何建造一个城市

一个人是无法管理一个城市的。不过,大多数时候城市都是在正常运转的。因为每个城市都有一组组人管理不同的部分,供水系统、供电系统、交通、执法等等。有人负责全局,其他人负责细节。

城市能运转,还因为它演化出恰当的抽象等级和模块,好让个人和他们所管理的部分即使在不了解全局时也能有效的运转。

尽管软件团队往往也是这样组织起来,但他们所致力的工作却常常没有同样的关注面切分及抽象层级。整洁的代码帮助我们在较低层的抽象层级上达成这一目标。本章介绍的是在较高层的抽象层级--系统层级上保持整洁。

将系统的构造与使用分开

构造和使用是非常不一样的过程。

软件系统应将起始过程和起始过程之后的运行时逻辑分离开,在起始过程中构建应用对象,也会存在互相纠缠的依赖关系。

每个应用程序都应该留意起始过程。那也是我们首先要考虑的问题。将关注的方面分离开,是软件技艺中最古老也是最重要的设计技巧。

分解 main

将构造与使用分开的方法之一是将全部构造过程过程搬到 main 或者被称之为 main 的模块中,设计系统的其余部分时,假设所有对象都已正确构造和设置。 main函数创建系统所需的对象,再传递给应用程序,应用程序只管使用。

扩容

城市都是由城镇发展而来。一开始道路狭窄,几乎无人涉足,随后逐渐拓宽。小型建筑和空地渐渐被更大的建筑所取代,一些地方最终矗立其摩天大楼。

这种成长并非全无阵痛。你有多少次开着车,艰难穿行过一个"道路改善"工程,问自己,他们为什么不一开始就修条够宽的路呢?但是谁又能打包票说在一个小镇修一个八车道不浪费呢。

所以一开始就做对系统,只是一种美好的期待。反之,我们已应该只去实现今天的功能,去实现能够预知的功能,然后不断重构,不断扩展。这就是迭代和增量敏捷的精髓所在。测试驱动开发、重构以及它们打造出的整洁代码,在代码层面保证了这个过程的实现。

但是在系统层面也应该尽可能的预先做好计划,做好系统架构。软件系统与物理系统可以类比。它们的机构都可以递增式的增长,只要我们持续将关注面恰当的切分。

最佳的系统架构是由模块化的关注面领域组成,每个关注面均用代码对象实现。不同的领域之间用最不具有侵害性的方面或类方面工具整合起来。这种架构能测试驱动,就像代码一样。

小结

系统应该是整洁的。侵害性架构会湮灭领域逻辑,冲击敏捷能力。当领域逻辑受到困扰,质量也就堪忧,因为缺陷更易隐藏,用户故事更难实现。当敏捷能力受到损害时,生产力也会降低, TDD 的好处遗失殆尽。