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


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



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


第三部分介绍OGSi结合Java怎样使用。以及怎样模块化现有系统。Java中无法直接模块化(Java SE模块化功能Jigsaw被推迟到了Jave SE 9),由于你能够随时訪问其它模块类中的随意public方法,想要强制性模块化,仅仅同意訪问公布的方法,能够使用OSGi框架。



这里模块化的概念和组件化相似,可部署、可管理、原生可重用、可组合、无状态的软件单元,对外提供了简单介绍的接口。在Java中,最适合模块化的单元就是Jar文件。


watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVlcGlhb2hhbjIwMDY=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">



代码层面我们关注的太多了,熟练的开发者如今非常少争论使用模式的优点,也不再识别哪个模式适合当前须要。由于都可以本能地使用各种设计原则和模式。从GoF的设计模式到衍生出的设计原则,如今非常多原则已经差点儿变成了本能。如“优先组合而不是继承”、“面向抽象而不是面向实现”。


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


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







通用的原则:

1、接口要更接近使用它们的类。而远离实现它们的类。

2、异常应该接近抛出它们的类或接口,而不是接近捕获异常的模块



模块化的一些模式和方法,大体的思想原则和类设计的原则相似,非常多方法都是基于“依赖抽象而非依赖实现”这个原则的。



1、悖论,粒度越小的模块越灵活。管理起来也就越复杂,怎样在灵活性和管理复杂度两者间取舍。最大化重用使得可用复杂化。粒度越小的模块重用性越高。可用性越低,也就是越不方便用。怎样在重用性和可用性之间取舍。尽管没有绝对的结论,可是慷慨向上有了结论。



2、稳定性,具有大量被依赖的模块应该是非常稳定的,也就是非常少发生变化。变化带来的影响更大。确保模块稳定性最好的方式就是将其转换为抽象模块。具有大量依赖其它模块的模块,是不稳定的,非常easy进行变化,易于使用,可是不easy測试(由于依赖其它模块太多)。最好的方式应该依赖抽象模块。



3、模块等级必须分等级。模块必须等级化,高等级依赖低等级。低等级不能依赖高等级。低等级不能有太多依赖,等级越低的模块应该越稳定,不稳定的模块应该放到高等级。

4、模块重用,类级别重用不能跨应用(比方工具类),而模块级别重用能够跨应用。

软件开发初期,需求处于不断变化之中。模块粒度应该大。易于管理和使用。随着识别出需求变化的重点。找出了可重用的地方。较大模块应该拆分成较小的、更易于重用的细粒度模块。软件开发初期就试图定义较小的细粒度模块是非常困难的,由于仅仅能推測重用点在哪,一般是失败的。



5、模块内聚:高内聚的模块易于理解、维护和重用。影响模块内聚的因素有2点,一个是类变化的频率,还有一个是类的可重用性。软件开发初期应基于变化频率构建模块,由于系统不稳定,系统稳定后,应基于重用构建模块。也就是说软件前期非常难创建高内聚的模块,随着系统稳定,开发团队应该又一次组织系统以确保模块都是内聚的。



6、模块依赖。高等级模块单向依赖低等级模块是最好的,最不好的就是循环依赖,这里提供几个方法消除依赖。

单向依赖时,比方低层级模块依赖高等级模块了,解决方法:

反转关系:稳定模块A依赖B的部分抽象接口。依赖自己接口。B去实现这个接口,达到B依赖A的反转。

消除关系:抽象出模块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有个办法强制解决,“等级化构建会强制你思考模块依赖...由于任何新的依赖都需要改动构建脚本。所以对于开发者,定义新的依赖必需要谨慎。

等级化构建使引入新的依赖要做很多其它的事情。”


刚參加工作时,开发过程中非常多功能假设使用前必须配置好几处的配置文件,当时认为非常麻烦,一直没找到非常有说服力的理由,读完本书总算发现了:


1、配置复杂通常代表着灵活程度高。越灵活使用起来越麻烦,越灵活越复杂,非常多事都这样,没有完美,仅仅有当前最适合的平衡点。

2、复杂的配置,让开发者更谨慎,假设没有这么复杂的配置。开发者会随便乱写。终于造成系统极其糟乱。

3、复杂的配置,集中于一处或一类地方。也方便审查梳理。

最后,本书的模块化设计思想让我收获颇多,眼下还不是特别流行,希望未来会变的很流行,未来的OSGi也将会带来生态系统(Eclipse成功是基于OSGi生态系统)。

版权声明:本文博客原创文章。博客,未经同意,不得转载。

(札记)Java应用架构设计-模块化模式与OSGi的更多相关文章

  1. Java应用架构设计模块化模式与OSGI摘录

    在Java中,最适合模块化的单元就是Jar文件. 代码层面我们关注的太多了,熟练的开发人员现在很少争论使用模式的好处,也不再识别哪个模式适合当前需要,因为都能够本能地使用各种设计原则和模式,从GoF的 ...

  2. Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle

    Atitit. 数据约束 校验 原理理论与 架构设计 理念模式java php c#.net js javascript mysql oracle 1. 主键1 2. uniq  index2 3.  ...

  3. 模块化模式与 OSGi

    模块化模式与 OSGi Android 模块化探索与实践 一.前言 万维网发明人 Tim Berners-Lee 谈到设计原理时说过:“简单性和模块化是软件工程的基石:分布式和容错性是互联网的生命.” ...

  4. JAVA师徒架构班 - 带徒模式

    (转: http://www.jeecg.org/forum.php?mod=viewthread&tid=2291&extra=page%3D1&page=1) 一个程序员技 ...

  5. java网站架构设计

    涉及到的技术及工具:java,springmvc,ibatis,freemarker,mysql,mongdb,memcached,ehcache,maven. 一个网站不可能说一开始就是要设计一个能 ...

  6. 15套java互联网架构师、高并发、集群、负载均衡、高可用、数据库设计、缓存、性能优化、大型分布式 项目实战视频教程

    * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩 展 ...

  7. 2017最新技术java高级架构、千万高并发、分布式集群、架构师入门到精通视频教程

    * { font-family: "Microsoft YaHei" !important } h1 { color: #FF0 } 15套java架构师.集群.高可用.高可扩展. ...

  8. Java开发架构篇:DDD模型领域层决策规则树服务设计

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在上一章节介绍了领域驱动设计的基本概念以及按照领域驱动设计的思想进行代码分层,但是仅 ...

  9. Swing程序最佳架构设计—以业务对象为中心的MVC模式(转)

    前言: 我打算写一系列关于Swing程序开发的文章.这是由于最近我在做一个Swing产品的开发.长期做JavaEE程序,让我有些麻木了.Swing是设计模式的典范,是一件优雅的艺术品,是一件超越时代的 ...

随机推荐

  1. Eclipse 打JAR包,插件FatJar 安装与使用

    下载fatJar插件,解压缩后是一个.../plugins/(net...)把plugins下面的(net..)文件夹拷贝到eclipse的plugins下,重新启动Eclipse3.1,Window ...

  2. 牟大哥:《App自我促销》连载2 直立人迁移走

    [谋哥每天一干货,第六十九篇] 前篇说到声音在远古时代.是一个奇妙的东西,它可以非常快地把信息传播到其它地方,突破了短距离. 然而能人的后代直立人学会了直立行走,他们開始走出非洲,到达遥远的中东.中国 ...

  3. cheese desktop内容

    #!/usr/bin/env xdg-open [Desktop Entry] Encoding=UTF- Version=1.0 Type=Application Terminal=false Na ...

  4. effective c++ 条款10 handle assignment to self operator =

    非强制性,但是个好习惯 当使用连锁赋值时很有用 x=y=z=10; class Window { public: Window& operator=(int size) { ... retur ...

  5. TinyXml高速入口(一)

    笔者:朱金灿 来源:http://blog.csdn.net/clever101 对于xml文件,眼下我的工作仅仅是集中在配置文件和作为简单的信息文件来用.因此我不太喜欢使用msxml这样的重量级的x ...

  6. UVA 538 - Balancing Bank Accounts(贪心)

    UVA 538 - Balancing Bank Accounts 题目链接 题意:给定一些人的欠钱关系,要求在n-1次内还清钱,问方案 思路:贪心,处理出每一个人最后钱的状态,然后直接每一个人都和最 ...

  7. HDU 3715 Go Deeper(2-sat)

    HDU 3715 Go Deeper 题目链接 题意:依据题意那个函数,构造x数组.问最大能递归层数 思路:转化为2-sat问题,因为x仅仅能是0.1,c仅仅能是0,1.2那么问题就好办了,对于0, ...

  8. [原创].NET 业务框架开发实战之七 业务层初步构想

    原文:[原创].NET 业务框架开发实战之七 业务层初步构想 .NET 业务框架开发实战之七 业务层初步构想 前言:本篇主要讲述如何把DAL和BLL衔接起来. 本篇议题如下: 1.       DAL ...

  9. SQLSERVER手动增长日志文件和数据文件

    原文:SQLSERVER手动增长日志文件和数据文件 SQLSERVER手动增长日志文件和数据文件 手动增长日志文件,实际上就是修改日志文件的大小  size 的单位是MB 下面设置日志文件大小是204 ...

  10. boostrap-非常好用但是容易让人忽略的地方------input-group-btn

    1.正常的使用 <div class="form-group"> <div class="input-group"> <input ...