整洁的代码帮助我们在较低层的抽象层级上达成项目代码简洁有力的目标,但是我们任然需要在较高的抽象层级-系统层级上保持整洁,就像一栋大楼,我们既需要内部装修的优美,也需要整个大楼各个部分责任明确、协调的工作。
1.将系统的构造和使用分开
构造和使用是非常不一样的过程,软件系统应将启始过程和启始过程之后的允许是逻辑分开,在启始过程中构件应用对象,也会存在互相纠缠的依赖你关系。也许这句话还够清晰,但是如果我们结合spring的依赖注入和控制反转所起到的作用就可以很好的理解这个思想了,这么看来,spring的DI和ico也许就是以拆分系统的构造和使用为思想导向而发展出来的
2.扩容
城市由城镇发展而来,一开始道路狭窄,随后逐渐扩宽,小型建筑和空地渐渐被更大的建筑所取代。但当城市道路扩展带来烦扰时,一定会有人抱怨为什么一开始不就修足够宽阔呢。这么看,系统也与一个城市的发展类似,总是在迭代和增量敏捷开发中,慢慢的扩展,重构。也许我们一开始就从系统的最终目标去设计它,但是在实际过程中,仍然会伴随着系统扩容的需求,这就需要我们的系统架构充分隔离关注问题(关注面切分)的架构,也可以浅显的理解为面向切面编程,为之后的扩容铺路。以持久化为例。可以声明哪些对象和属性应当被持久化,然后将持久化任务委托给持久化框架,行为的修改由AOP框架以无损方式在目标代码中进行。
3.java实现面向切面方案1-java代理
java代理适用于简单的情况,例如在单独的对象或类中包装方法的调用。然而JDK提供的动态代理仅能与接口协同工作,对于代理类,需要使用字节码操作库,如CGLIB\ASM或Javassist
4.java实现面向切面方案2-纯Java Aop框架
许多编程工具能自动处理大多数代理模板代码,比如Spring AOP和JBossAOP,我们可以依赖他们以纯Java代码实现面向方面编程,比如Spring的注解式事务支持。
5.java实现面向切面方案3-AspectJ
通过切面来实现关注面切分的功能最全的工具是AspectJ,我们可以通过Spring FrameWork更加容易的使用它的特性。
6. 测试驱动系统架构
最佳的系统架构由模块化的关注面领域组成,每个关注面均用纯java对象实现,不同的领域之间用最不具侵害性的方面或者类方面工具整合起来,这种架构能测试驱动,就像代码一样。
7.优化决策
模块化和关注面切分成就了分散化管理和决策,拥有模块化关注面的POJO系统提供的敏捷能力,允许我们基于最新的知识做出优化、时机刚好的决策。