整洁代码的层次继续上升,从类到系统,本章讲解如何在较高的系统层级上保持代码整洁
11.1 如何建造一个城市
- 系统和城市一样,有些人负责全局,其他人负责细节,几乎不可能一个人掌控所有
11.2 将系统的构造与使用分开
- 软件系统应该将启动过程和运行时逻辑进行分离
11.2.1 分解 main 方法
- 将构造与使用分开的方法之一就是 将全部的构造过程搬迁到 main 方法中
11.2.2 工厂
- 有时候应用程序也要负责确定什么时候创建对象
11.2.3 依赖注入( Dependency Injection ,DI )
- 控制反转( Inversion of Control ,IoC ) 时依赖注入的一种应用手段
- 控制反转将对象的第二权责抽离出来,转移到另一个属于它的对象中,使两个对象都遵循 单一权责原则
11.3 扩容
- 系统需要扩容是非常现实的需求,因为一开始没有人能把一切都设计的那么超前
- 迭代和增量开发是每个系统都需要经历的事
- 面向切面编程( aspect-oriented progamming ,AOP ) 是一种可以让系统实现快速扩容的编程手段
- 在 AOP 中,被称为切面的模块构造,指明了系统中哪些行为会通过某种方式被修改,从而让某些特定场景被支持
11.4 Java 代理
- JDK 提供的 动态代理 只能和借口协同工作
- 庞大的代码量和复杂的操作逻辑是动态代理的两大弱点
11.5 纯 Java AOP 框架
- SpringAOP 就是一个纯 Java AOP 框架,它通过编写 XML 内容来实现系统中各种 Bean 的依赖注入
11.6 AspectJ 的切面
- AspectJ 是通过切面来实现关注面切分的工具
11.7 测试驱动系统架构
- 最佳的系统架构由模块化的关注面领域组成,每个关注面都使用统一对象实现
11.8 优化决策
- 模块化和关注面切分成就了分散化的管理和决策
- 有时候决策不一定非要预先作出,延迟决策到最后一刻也不失为一种好手段
11.9 明智使用添加了可论证价值的标准
- 创立标准的过程有时非常漫长
11.10 系统需要领域特定语言
- 领域特定语言( Doamin-Specific Lanuage ,DSL ) 是一种单独的小型脚本语言,或通过标准语言编写的 API 集合
11.11 小结
- 系统也应该是整洁的
- 侵害性架构会湮灭系统逻辑,冲击整个系统的敏捷开发能力
- 无论是设计系统或单独的模块,都最好使用当前环境下可实现的最简单方案