软件框架-无绪开发4

模块化架构

将单个应用拆分拆分成不同的模块可大大改善设计。20世纪60年代意大利面条代码。
模块化程序,是由不同模块构成,一个模块是一组类的集合,模块中有些类是public级别,外部模块可访问;有些是private基本,外部不可访问。
此外,一个模块会依赖于其他模块,并在较高层次上声明了执行所需的功能性环境。
评价模块好坏: 检测模块间的依赖。
项目都会演进,规模变大。
第一版: 一定要清除所有不必要的交叉引用关系,将API按照逻辑功能进行模块开发。
只要代码开始访问其他无关模块中的内容时,架构退化就不可避免了。
只关注那些对成功至为重要的关键组件
模块化可使项目更加清楚,更好管理模块间的依赖关系,维护更加灵活。一开始就模块化思想进行设计才是王道。

1.模块化计的类型

(1)只与用户界面有关的代码不需要提供对外的API,它完全封闭,只需保证功能可用即可。Favorites 幸运模块
(2)简单又通用的功能类库模块---可使用第三方类源码,(如果直接使用第三方库,拓展会出现问题,此时设计中应该以PDF文档的格式来发布相关的API文档,对相应的规范内容加以说明,同时提供示例代码)
只有真正的模块化处理才能解决多个开发商产品间冲突的问题。模块化架构将规范与具体实现分离,分别放到不同的模块中。
(3)方法
1)定义一个模块专用于存放规范,其文档中覆盖的实际接口和抽象类灯。此模块中至少存放一个小的“入口点”,比如说构造函数或者静态工厂方法,这样客户端代码可通过入口获取具体的实现内容。
模块化类库,不应该通过复制类文件来解决多个开发方类库冲突的问题,因为会导致类文件重复。复制类文件无法与开发商的具体实现分离。
2)一个独立模块对外提供很多接口,再加上一两个工厂类,就可以用了定义一套规范。可以添加一些文档进行说明
3)具体实现,是一个没有直接对外暴露其功能的包,它只依赖那个规范模块和其他一些实现模块,然后通过注册服务的方式,将自己实现的工厂注入到服务系统中。
4)一个客户也可以看成一个模块,同具体实现。
5)但有时候间接依赖也是必须的,有时候规范模块也会依赖实现模块

2.组件定位和交互

模块化目的:实现程序中各个组成部分的松耦合。两个模块如果独立,彼此就不知道对方的存在,通过接口进行交互。
可减少杂乱代码。
运行环境准备工作通常是由一个框架来完成的,使用依赖注入的方式,完成初始化。
(1)定义接口类
(2)继承实现
有参数的构造函数是一种常用的注入方式
模块化开发缺点:执行较慢,毕竟没有免费的午餐。
最好不使用直接调用代码来绑定服务的方式,而使用一种声明的方式进行服务绑定。常用声明方式System.getProperty("...")来完成。
另一种方式使用 xml 配置方式,

3.编写扩展点

Java的Lookup就很好,可以参考,它运行外部通过实现该接口来扩展功能。

4.循环依赖的必要性

有些系统循环依赖是很有用的,特别是遗留代码。但如果新代码就像一团乱麻。
对于容器,规则越严格,用户基于该容器开发架构越清晰。
当这一团乱麻无法维护时,只得将它打在一个包里,这样丧失了多模块的好处。
可以作为组件注入机制来避免或者减少循环依赖,从而做到模块间的分离。
当决定模块化开发,就一定保证模块间出现循环依赖。

5.满城尽是Lookup

Java的Lookup很好,但是C++有什么可以替代Lookup的呢?
qt的信号槽? 虽然可以,但是有时反应会很慢。

6.Lookup的滥用

Java的Lookup很好,但不能滥用。如信号槽方式虽好,但滥用会导致系统性能下降。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yongwuzhijing800

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值