理论部分
包的复用原则可以分为两大类
组件的内聚性原则:粒度
重用-发布等价原则(Reuse-Release Equialence Principle, REP)
重用的粒度就是发布的粒度。
你自己如果是某个可重用组件(包)的用户,这个组件(包)必须满足那些条件你才会乐于使用呢?
1)有清晰的文档和接口说明
2)有人维护
3)发布新版本时能够得到及时的通知,而且如果当前版本已经满足你的要求,那么你有权要求不跟着升级,即新版本发布后老版本仍然能够work的很好。
4)组件中的类都是可重用的,不能包含不可重用的类。比如一个可复用包中却包含一个只有在特定系统,特定约束下才可以使用的class,这会让人产生疑惑。
5)你复用的这个组件有且只有一个明确的目的,比如你想复用的是一个金融系统的框架,那么就不能在这个包中还有机械软件计算的组件。
共同重用原则(Common-Reuse Principle,CRP)
一个组件中的类应该是共同重用的。如果重用了组件中的一个类,那么就要重用组件中的所有类,否则就说明该组件违反了CRP。这个原则告诉我们,哪些类不应该放在一起。当一个组件使用了另外的一个组件时,二者之间就产生了依赖关系,哪怕只是使用了另外组件中的一个类,也不会导致依赖关系变弱,当被依赖的组件发生变化时,使用者必须升级,哪怕产生变化的原因其实跟使用者依赖的那个类没有任何关系,这就给使用者带来了不必要的麻烦。因此作为用户,当我想要依赖某个组件时,我肯定希望引起这个组件变化的原因越少越好。
共同封闭原则(Common-Closure Principle,CCP)
组件中的所有类对于同一种性质的变化应该是共同封闭的。一个变化若对一个封闭的组件产生影响,则将对该组件中的所有类产生影响,而对于其他组件则不造成任何影响。
REP和CRP从用户的角度希望包尽量小。而CCP从开发者的角度考虑希望包大一些,有人说CCP是面向对象设计原则SRP对于组件的重新规定,我没有充分理解,不完全赞同。
组件的耦合性原则:稳定性
无环依赖原则(Acyclic-Dependencies Principle,ADP)
在组件的依赖关系图中不允许出现环。
稳定依赖原则(Stable-Denpendencies Principle,SDP)
朝着稳定的方向进行依赖。如果一个组件,对外不依赖任何其他组件,而都是其他组件依赖它,那么这个组件时最稳定的。反之,如果再没有组件依赖它,而都是它依赖其他组件,那么这个组件是最不稳定的。
关于稳定性的公式
I=Ce/(Ca+Ce)
I:不稳定性 Ce:该组件依赖外部组件的数目 Ca:外部组件依赖该组件的数目
I=0 则最稳定,I=1最不稳定
稳定抽象原则(Stable-Abstractions Principle,SAP)
组件的抽象程度应该与其稳定程度一致。这个和面向对象设计OCP原则是一致的,变化的与不变的分离,把变化的进行封装。稳定的组件应该也是抽象的(不变的),不稳定的组件应该是具体的(可能变化的)。
实践部分
我们部门对外提供基础服务,这些服务都是以soa的形式提供的。
目前我们开发一个soa服务,大概需要如下几个工程(处于商业保密的考虑,凡是可能涉及到公司架构或者业务信息的地方我都用xxx代替):
1. xxx-service:soa服务的核心逻辑
2. xxx-server:该服务的Controller
3. xxx-api :用户调用该soa服务的api接口
4. xxx-model : soa服务依赖的一些模型对象,这些对象有的是简单的值对象,有的则含有业务逻辑是个真正的Bean。这些对象可能作为用户api的调用参数,因此xxx-model可能会被xxx-service和xxx-api同时依赖。
目前,xxx-model工程中包含所有soa服务的model对象,而不是以soa服务为单位。这样带来的问题是:
当用户要使用某个soa服务A的时候,他需要依赖xxx-api和xxx-model,而后者不仅包含A的model还包含B的,C的。。。,导致用户实际上与所有soa服务的model对象产生了依赖,而实际上用户对B或者C可能根本不关心。一个直接的表现就是用户通过maven管理生成的发布包非常之大,而且还非常容易产生各种因其他服务而引起的错误。
有人认为造成这种局面的原因是xxx-model中很多对象不是简单的值对象而是包含很多业务逻辑,导致这些对象有很深的依赖。
我认为这不是根本原因,根本原因是xxx-model工程违反了“共同重用原则(CRP)",如果以soa服务为单位组织xxx-model,那么即使某个soa的xxx-model中的对象有很多业务逻辑,有很深的依赖,也不会影响不依赖该soa服务的用户。前人们只所以把所有model类都放在一个工程里,其实是从开发者方便的角度考虑过多的结果,即过度的遵守了CCP而导致严重的违反了CRP,导致用户很受累。
所以,一个更合理的工程组织方式(这里简单认为工程组织方式就是jar包发布方式)应该是:对于soa服务A,它由如下工程构成
A-service
A-server
A-model(可选的,有些服务接口很简单,可能就不需要model工程)
A-api
发布时,以上4个工程作为整体(或者说原子)来发布。
以后在重构或者设计新的soa服务时,请大家注意这个问题。
分享到:
相关推荐
第20章 包的设计原则 第21章 FACTORY模式 第22章 薪水支付案例研究(第2部分) 第五部分 气象站案例研究 第23章 COMPOSITE模式 第24章 OBSERVER模式—回归为模式 第25章 ABSTRACT SERVER模式、ADAPTER模式和BRIDGE...
.NET应用架构设计原则、模式与实践是IT领域中一个重要的主题,它涵盖了软件开发的多个层面,包括系统设计、模块划分、代码组织以及最佳实践。这些原则和模式旨在提高软件的可维护性、可扩展性和可重用性,降低复杂性...
### 敏捷软件开发:原则、模式与实践(C#版) #### 一、敏捷开发原则 本书由面向对象技术大师Robert C. Martin撰写,详细介绍了敏捷开发的基本原则。敏捷开发强调快速响应变化、客户协作优先级高于合同谈判、工作...
组合与聚合复用原则鼓励使用组合或聚合来达到复用的目的,而不是通过继承。 - **区别**: - **聚合**:表示“含有”关系,部分可以独立存在。 - **组合**:表示更强的“拥有”关系,部分不能独立存在。 - **实践...
"8包设计原则(二)"的课程内容很可能涵盖了这八个关键的设计原则,它们分别是:单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)、依赖倒置原则(DIP)、迪米特法则(LoD)、...
总的来说,《敏捷软件开发:原则、模式与实践》为读者提供了一个全面、实用的敏捷开发框架,并结合了大量的实践案例和代码示例,帮助读者更好地理解敏捷开发的原理、方法和应用。通过阅读这本书,读者不仅能够了解...
第二十章 包的设计原则 第二十一章 FACTORY模式 第二十二章 薪水支付案例研究(第2部分) 第Ⅴ部分 气象站案例研究 第二十三章 COMPOSITE模式 第二十四章 OBSERVER模式——回归为模式 第二十五章 ABSTRACT SERVER...
中文名: 敏捷软件开发:原则、模式与实践 原名: Agile Software Development:Principles,Patterns and Practices 别名: 软件工程实践丛书 作者: (美)Robert C.Martin译者: 邓辉 孟岩图书分类: 软件 资源格式: PDF ...
"8包设计原则(一)"的课程内容很可能涵盖了这八个关键的设计原则,它们分别是:单一职责原则(SRP)、开放封闭原则(OCP)、里氏替换原则(LSP)、接口隔离原则(ISP)、依赖倒置原则(DIP)、迪米特法则(LoD)、...
第一部分 敏捷开发 第1章 敏捷实践 第2章 极限编程概述 第3章 计划 第4章 测试 第5章 重构 第6章 一次编程实践 第二部分 敏捷设计 第7章 什么是敏捷设计 第8章 SRP:单一职责原则 第9章 OCP:开放-封闭原则 第10章 ...
《敏捷软件开发:原则、模式与实践》是敏捷开发领域的一部经典著作,全面而深入地探讨了敏捷方法的核心理念、关键原则、实用模式以及实践经验。这本书由Robert C. Martin撰写,他是一位知名的软件工程师和敏捷开发的...
《敏捷软件开发:原则模式与实践》是综合性、实用性的敏捷开发和极限编程方面的指南,讲述了在预算和时间要求下软件开发人员和项目经理如何使用敏捷开发完成项目:使用真实案例讲解如何用极限编程来设计、测试、重构...
《敏捷软件开发:原则模式与实践》是综合性、实用性的敏捷开发和极限编程方面的指南,讲述了在预算和时间要求下软件开发人员和项目经理如何使用敏捷开发完成项目:使用真实案例讲解如何用极限编程来设计、测试、重构...
这些模式经过时间的考验,被广泛应用于各种面向对象的软件开发中,以提高代码的可读性、可维护性和可复用性。本教程旨在深入讲解设计模式的基本原理和应用方法,帮助开发者构建更加健壮和灵活的软件系统。 首先,...
总结起来,“C++可复用代码——命令行控制模块”提供了构建自定义Shell程序的蓝图,利用面向对象编程和代码复用原则,使得开发者可以高效地开发出功能丰富的命令行应用。这个框架涵盖了命令解析、命令执行、错误处理...
这些模式是经过实践检验的,可以在不同项目中重复使用,从而减少开发时间,降低维护成本,提高代码的可读性和可维护性。 在对象模型方面,书中的内容可能涵盖以下几个核心概念: 1. **类与对象**:讨论如何通过类...
总的来说,通过面向对象的设计原则和模式,我们可以有效地实现AsyncTask的复用,使得异步任务的编写更加灵活和高效。在实践中,不断探索和优化这些设计,能够提高Android应用的性能和用户体验。
这些原则有助于创建可维护、可扩展和可复用的代码。 3. **设计模式**:书中提到的模式可能包括工厂模式、单例模式、建造者模式、观察者模式、装饰器模式、代理模式、策略模式、状态模式、命令模式等。这些设计模式...
总结来说,这本书是面向C++程序员的一份宝贵资源,它深入探讨了设计模式的理论与实践,通过具体的案例分析,帮助读者掌握面向对象设计的核心原则。无论是初学者还是经验丰富的开发者,都可以从中受益,提升自己的...
设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。...无论是初学者还是经验丰富的开发者,这本书都是一个宝贵的参考资料,帮助他们掌握面向对象设计的核心原则和最佳实践。