(札记)Java应用架构设计-模块化模式与OSGi
第一部分介绍了模块化概念。为什么要模块化,以及一些模块化要考虑的东西,如模块粒度,依赖关系,重用性灵活性等。
第二部分介绍模块化的一些模式。採用了GoF设计模式的格式(模式名称、模式表述、图示、描写叙述、多种实现、效果、例子、小结),看着有些乱,可是收获不少。
第三部分介绍OGSi结合Java怎样使用。以及怎样模块化现有系统。Java中无法直接模块化(Java SE模块化功能Jigsaw被推迟到了Jave SE 9),由于你能够随时訪问其它模块类中的随意public方法,想要强制性模块化,仅仅同意訪问公布的方法,能够使用OSGi框架。
这里模块化的概念和组件化相似,可部署、可管理、原生可重用、可组合、无状态的软件单元,对外提供了简单介绍的接口。在Java中,最适合模块化的单元就是Jar文件。
代码层面我们关注的太多了,熟练的开发者如今非常少争论使用模式的优点,也不再识别哪个模式适合当前须要。由于都可以本能地使用各种设计原则和模式。从GoF的设计模式到衍生出的设计原则,如今非常多原则已经差点儿变成了本能。如“优先组合而不是继承”、“面向抽象而不是面向实现”。
通用的原则:
1、接口要更接近使用它们的类。而远离实现它们的类。
2、异常应该接近抛出它们的类或接口,而不是接近捕获异常的模块
模块化的一些模式和方法,大体的思想原则和类设计的原则相似,非常多方法都是基于“依赖抽象而非依赖实现”这个原则的。
1、悖论,粒度越小的模块越灵活。管理起来也就越复杂,怎样在灵活性和管理复杂度两者间取舍。最大化重用使得可用复杂化。粒度越小的模块重用性越高。可用性越低,也就是越不方便用。怎样在重用性和可用性之间取舍。尽管没有绝对的结论,可是慷慨向上有了结论。
2、稳定性,具有大量被依赖的模块应该是非常稳定的,也就是非常少发生变化。变化带来的影响更大。确保模块稳定性最好的方式就是将其转换为抽象模块。具有大量依赖其它模块的模块,是不稳定的,非常easy进行变化,易于使用,可是不easy測试(由于依赖其它模块太多)。最好的方式应该依赖抽象模块。
3、模块等级必须分等级。模块必须等级化,高等级依赖低等级。低等级不能依赖高等级。低等级不能有太多依赖,等级越低的模块应该越稳定,不稳定的模块应该放到高等级。
4、模块重用,类级别重用不能跨应用(比方工具类),而模块级别重用能够跨应用。
软件开发初期,需求处于不断变化之中。模块粒度应该大。易于管理和使用。随着识别出需求变化的重点。找出了可重用的地方。较大模块应该拆分成较小的、更易于重用的细粒度模块。软件开发初期就试图定义较小的细粒度模块是非常困难的,由于仅仅能推測重用点在哪,一般是失败的。
5、模块内聚:高内聚的模块易于理解、维护和重用。影响模块内聚的因素有2点,一个是类变化的频率,还有一个是类的可重用性。软件开发初期应基于变化频率构建模块,由于系统不稳定,系统稳定后,应基于重用构建模块。也就是说软件前期非常难创建高内聚的模块,随着系统稳定,开发团队应该又一次组织系统以确保模块都是内聚的。
6、模块依赖。高等级模块单向依赖低等级模块是最好的,最不好的就是循环依赖,这里提供几个方法消除依赖。
单向依赖时,比方低层级模块依赖高等级模块了,解决方法:
消除关系:抽象出模块C。A依赖C(A使用C)。B依赖C(B实现C),达到A和B不依赖关系。
下移:将依赖成因下移到高等级模块,与上移相反,创建一个更低等级模块而已。
回调:定义一个抽象体,将其注入到模块中,达到单向依赖甚至消除依赖个可能。
7、模块应该轻量级。不依赖容器和执行环境,可单独部署使用最好。
8、模块管理。假设不打算重用某个模块,那么依赖管理的动力就是可维护性,假设想要可维护性提高,就要关注可測试性(越easy測试、则越easy维护)。
最好在開始的时候尽可能简单并随着需求出现增强模块,而不是開始的时候基于预測创建复杂模块。
9、默认实现。模块应该有一个默认实现,假设没有不论什么实现,模块实际上仅仅是一个规范。
(比方默认实现就是插件式开发的一种方式。)
10、依赖抽象就必须保证获取实现类的实例时,不能new,经常用法有3类,工厂方法、动态创建(如Spring注入)、OSGi μService。
11、假设依赖抽象体的全部类都在一个模块中,那么将这些类和抽象体放在同一个模块中。假设依赖抽象体的全部类位于多个模块中。那么将抽象体放到一个单独的模块中。
最后说说为什么要用OGSi来强制模块化。“优雅的理念设计在实现的过程中非常快就可能变得一团糟,没有开发者可以理解最初的高级愿景要怎样展如今代码中。虽然你非常清楚预期的模块关系是什么。可是不想要的依赖依旧会进入你的应用。”真实情况确实如此,任何原因,终于的结果都是一样的。就是我们的代码越来越差,模块关系混乱了,代码可以定期重构,可是模块重构的代价比較大,OGSi有个办法强制解决,“等级化构建会强制你思考模块依赖...由于任何新的依赖都需要改动构建脚本。所以对于开发者,定义新的依赖必需要谨慎。
等级化构建使引入新的依赖要做很多其它的事情。”
2、复杂的配置,让开发者更谨慎,假设没有这么复杂的配置。开发者会随便乱写。终于造成系统极其糟乱。
3、复杂的配置,集中于一处或一类地方。也方便审查梳理。
最后,本书的模块化设计思想让我收获颇多,眼下还不是特别流行,希望未来会变的很流行,未来的OSGi也将会带来生态系统(Eclipse成功是基于OSGi生态系统)。
版权声明:本文博客原创文章。博客,未经同意,不得转载。
相关文章
- Android如何通过Gradle发布java依赖库(jar)到 jitpack 公共仓库(—)
- java局域网发送文件_Java如何实现局域网文件传输代码案例分享
- java backoff_Java BackOff类代码示例
- think in java一_Think in Java(一):Java基础「建议收藏」
- java单例模式_Java单例模式
- java和基岩版区别_我的世界基岩版与Java版有什么区别?「建议收藏」
- java循环语句_Java中的循环语句
- java启动器_JAVA基础:Java 启动器如何查找类
- 什么是java虚拟机(Java Virtual Machine)?
- java与python-如何对比Python和Java,只需三分钟告诉你!
- Java基础之int和Integer有什么区别
- java一种集合_java创建集合
- java prototype是什么,Java设计模式之原型模式(Prototype模式)介绍
- Java并发编程学习前期知识下篇
- Java的学习笔记(10)对象 五
- Java面试必问多线程简答题
- 面向对象设计模式--单例模式详解+实际应用(Java)
- 中的应用Java中MySQL的灵活运用(mysql在java代码)
- 程序Linux下构建Java应用:从入门到精通(linux下开发java)
- 技术的融合突破极限:Java与Redis的技术融合(java与redis)
- 深入Linux环境下Java应用调试实践(linux调试java)
- 快速构建Java应用:Java与MySQL的组合之旅(javamysql包)
- Linux下快速编写高效的Java代码(linux写java)
- 工具Linux上使用Java开发的利器:选择指南(linux选择java)
- Java与Linux搭配,开发无限可能(java与linux)
- 使用Java管理Redis过期缓存(redisjava过期)
- 服务器快速搭建Linux Java服务器,实现互联网应用(linux搭建java)
- 使用redis .jar实现高效的Java应用缓存管理(redis.jar)
- Java面试中的Redis题目剖析(java面试题redis)
- 管理Linux下Java版本管理:轻松实现多版本切换(linux下java版本)
- Java应用在Linux上乱码的原因及解决方法(java linux乱码)
- Java应用架构优化基于Oracle10g的实践(c oracle10g)
- Oracle与Java程序融合谱写成功曲(java程序Oracle)
- Java与Oracle同步一种新的数据库模式(java同步oracle)
- 数据库Java编程修改Oracle数据库的实践(java修改oracle)
- Java如何帮助掌握Oracle(java了解oracle)
- Java类变量和成员变量初始化过程的应用介绍
- java中数组的应用及方法
- Java单例模式的应用示例