(读书笔记)Java应用架构设计

本书主要模块化模式的好处、模块化方法与模式、OSGi简单使用等内容,分3大部分:

第一部分介绍了模块化概念,为什么要模块化,以及一些模块化要考虑的东西,如模块粒度,依赖关系,重用性灵活性等。

第二部分介绍模块化的一些模式,采用了GoF设计模式的格式(模式名称、模式表述、图示、描述、多种实现、效果、样例、小结),看着有些乱,但是收获不少。

第三部分介绍OGSi结合Java如何使用,以及如何模块化现有系统。Java中无法直接模块化(Java SE模块化功能Jigsaw被推迟到了Jave SE 9),因为你可以随时访问其他模块类中的任意public方法,想要强制性模块化,只允许访问发布的方法,可以使用OSGi框架。这里模块化的概念和组件化相似,可部署、可管理、原生可重用、可组合、无状态的软件单元,对外提供了简介的接口。在Java中,最适合模块化的单元就是Jar文件。

代码层面我们关注的太多了,熟练的开发人员现在很少争论使用模式的好处,也不再识别哪个模式适合当前需要,因为都能够本能地使用各种设计原则和模式,从GoF的设计模式到衍生出的设计原则,现在很多原则已经几乎变成了本能,如“优先组合而不是继承”、“面向抽象而不是面向实现”。

但是只考虑类级别的设计,那么不管设计的多么漂亮,都不会代码预期的收益。因为现有的设计原则和面向对象开发模式不能帮助管理大型软件系统的复杂性,因为他们解决的是不同的问题。

架构的目标是尽可能减少变化的影响和成本。模块化通过填补高层架构组件以及底层代码之间的空白,帮助我们实现这个目标。

通用的原则:1、接口要更接近使用它们的类,而远离实现它们的类。2、异常应该接近抛出它们的类或接口,而不是接近捕获异常的模块模块化的一些模式和方法,大体的思想原则和类设计的原则相似,很多方法都是基于“依赖抽象而非依赖实现”这个原则的。1、悖论,粒度越小的模块越灵活,管理起来也就越复杂,如何在灵活性和管理复杂度两者间取舍。最大化重用使得可用复杂化,粒度越小的模块重用性越高,可用性越低,也就是越不方便用,如何在重用性和可用性之间取舍。虽然没有绝对的结论,但是大方向上有了结论。2、稳定性,具有大量被依赖的模块应该是很稳定的,也就是很少发生变化,变化带来的影响更大。确保模块稳定性最好的方式就是将其转换为抽象模块。具有大量依赖其他模块的模块,是不稳定的,很容易进行变化,易于使用,但是不容易测试(因为依赖其他模块太多),最好的方式应该依赖抽象模块。3、模块等级必须分等级,模块必须等级化,高等级依赖低等级,低等级不能依赖高等级,低等级不能有太多依赖,等级越低的模块应该越稳定,不稳定的模块应该放到高等级。4、模块重用,类级别重用不能跨应用(比如工具类),而模块级别重用可以跨应用。软件开发初期,需求处于不断变化之中,模块粒度应该大,易于管理和使用。随着识别出需求变化的重点,找出了可重用的地方,较大模块应该拆分成较小的、更易于重用的细粒度模块。软件开发初期就试图定义较小的细粒度模块是很困难的,因为只能猜测重用点在哪,通常是失败的。5、模块内聚:高内聚的模块易于理解、维护和重用。影响模块内聚的因素有2点,,一个是类变化的频率,另一个是类的可重用性。软件开发初期应基于变化频率构建模块,因为系统不稳定,系统稳定后,应基于重用构建模块。也就是说软件前期很难创建高内聚的模块,随着系统稳定,开发团队应该重新组织系统以确保模块都是内聚的。6、模块依赖,高等级模块单向依赖低等级模块是最好的,最不好的就是循环依赖,这里提供几个方法消除依赖。单向依赖时,比如低层级模块依赖高等级模块了,解决方法:

反转关系:稳定模块A依赖B的部分抽象接口,依赖自己接口,B去实现这个接口,达到B依赖A的反转。消除关系:抽象出模块C,A依赖C(A使用C),B依赖C(B实现C),达到A和B不依赖关系。

两个模块有循环依赖关系,通常就是一个模块,应该合并。如果不合并就要打破这种关系,解决办法有:

上移:将依赖成因上移到高等级模块,创建一个更高等级模块,抽象出最低等级模块依赖关系,达到单向依赖。下移:将依赖成因下移到高等级模块,与上移相反,创建一个更低等级模块而已。回调:定义一个抽象体,将其注入到模块中,达到单向依赖甚至消除依赖个可能。

其实通过反转和消除,也能解决循环依赖,根据具体使用场景选择吧。

我希望你能知道,我的心永远只为你跳动。

(读书笔记)Java应用架构设计

相关文章:

你感兴趣的文章:

标签云: