“Complexity kills. It sucks the life out of developers, it makes products difficult to plan, build and test.”(复杂要人命,它消磨开发者的生命,让产品难于规划、构建和测试)
1.如何建造一个城市
-
1.每个城市都有一组人管理不同的部分,有人负责全局,其他人负责细节
-
2.深化出恰当的抽象等级和模块,好让个人和他们所管理的“组件”即便在不了解全局时也能有效地运转
2.将系统的构造与使用分开
-
1.构造与使用是非常不一样的过程
-
2.软件系统应将启始过程和启始过程之后的运行时逻辑分离开,在启始过程中构建应用对象,也会存在互相缠结的依赖关系
-
3.将构造与使用分开的方法之一是将全部构造过程搬迁到main或被称为main的模块中,设计系统的其余部分时,假设所有对象都已正确构造和设置
-
4.可以使用抽象工厂模式让应用自行控制何时创建对象,但构造的细节却隔离于应用程序代码之外
-
5.控制反转 将第二权责从对象中拿出来,转移到另一个专注于此的对象中,从而遵循了单一权责原则。在依赖管理情景中,对象不应负责实体化对自身的依赖,反之,它应当将这份权责移交给其他“有权力”的机制,从而实现控制的反转
Jndi查找是DI的一种部分实现,在JNDI中,对象请求目录服务器提供一种符合某个特定名称的“服务”。
延后初始化的好处:
- 多数DI容器在需要对象之前并不构造对象,
- 其次,许多这类容器提供调用工厂或者代理的机制,而这种机制可谓延迟赋值或类似的优化处理所用
3.扩容
-
1.“一开始就做对系统”纯属神话 ,反之,我们应该只去实现今天的用户故事,然后重构,明天再扩展系统、实现新的用户故事,这就是迭代和增量敏捷的精髓所在。测试驱动开发、重构以及它们打造出的整洁代码,在代码层面保证了这个过程的实现
-
2.软件系统与物理系统可以类比。它们的架构都可以递增式的增长,只要我们持续将关注面恰当地切分
横贯式关注面:
- 原则上,可以从模块、封装的角度推理持久化策略。但是在实践上,却不得不将实现了持久化策略的代码铺展到许多对象中,这就是横贯式关注面
- 实际上,EJB架构处理持久化、安全和事务的方法是“预期“面向方面编程,而Aop是一种恢复横贯式关注面模块化的普适手段,在AOP中,被称为方面的模块构造指明了系统中哪些点的行为会以某种一致的方式被修改,从而支持某种特定的场景。这种说明是用某种简洁的声明或编程机制来实现的。
以持久化为例,可以声明哪些对象和属性(或其模式)应当被持久化,然后将持久化任务委托给持久化框架。行为的修改由 AOP 框架以无损方式在目标代码中进行。
4.Java代理
- 1.适用于简单情况,例如在单独的对象或类中包装方法调用。然而,JDK 提供的动态代理仅能与接口协同工作。对于代理类,你得使用字节码操作库,比如 CGLIB、ASM 或 Javassist。
代码量和复杂度是代理的两个大弱点,创建整洁代码变得很难。
如下例子: