`
jiangwenfeng762
  • 浏览: 286393 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

包复用原则&实践

阅读更多

理论部分

包的复用原则可以分为两大类

组件的内聚性原则:粒度

重用-发布等价原则(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...

    敏捷软件开发:原则、模式与实践.pdf 高清

    第二十章 包的设计原则 第二十一章 FACTORY模式 第二十二章 薪水支付案例研究(第2部分) 第Ⅴ部分 气象站案例研究 第二十三章 COMPOSITE模式 第二十四章 OBSERVER模式——回归为模式 第二十五章 ABSTRACT SERVER...

    敏捷软件开发:原则、模式与实践.pdf

    第二十章 包的设计原则 第二十一章 FACTORY模式 第二十二章 薪水支付案例研究(第2部分) 第Ⅴ部分 气象站案例研究 第二十三章 COMPOSITE模式 第二十四章 OBSERVER模式——回归为模式 第二十五章 ABSTRACT SERVER...

    敏捷软件开发:原则、模式与实践.pdf

    中文名: 敏捷软件开发:原则、模式与实践 原名: Agile Software Development:Principles,Patterns and Practices 别名: 软件工程实践丛书 作者: (美)Robert C.Martin译者: 邓辉 孟岩图书分类: 软件 资源格式: PDF ...

    敏捷软件开发原则、模式与实践 C#版

    第一部分 敏捷开发 第1章 敏捷实践 第2章 极限编程概述 第3章 计划 第4章 测试 第5章 重构 第6章 一次编程实践 第二部分 敏捷设计 第7章 什么是敏捷设计 第8章 SRP:单一职责原则 第9章 OCP:开放-封闭原则 第10章 ...

    敏捷软件开发:原则、模式与实践 pdf 带目录标签 part 2

    《敏捷软件开发:原则模式与实践》是综合性、实用性的敏捷开发和极限编程方面的指南,讲述了在预算和时间要求下软件开发人员和项目经理如何使用敏捷开发完成项目:使用真实案例讲解如何用极限编程来设计、测试、重构...

    敏捷软件开发:原则、模式与实践 pdf 带目录标签 part1

    《敏捷软件开发:原则模式与实践》是综合性、实用性的敏捷开发和极限编程方面的指南,讲述了在预算和时间要求下软件开发人员和项目经理如何使用敏捷开发完成项目:使用真实案例讲解如何用极限编程来设计、测试、重构...

    敏捷软件开发:原则、模式与实践(全).part2.rar

    一共两个包,全下载解压 2003年6月荣获美国《软件开发》第13届震憾(Jolt)大奖! 在本书中,享誉全球的软件开发专家和软件工程大师Robert C.Martin将向您展示如何解决软件开发人员、项目经理及软件项目领导...

    RUP大讲堂(第二讲)-业务驱动开发的原则(课件)

    这些原则是RUP开发出来的基础,是可复用的方法模型和过程建构的框架,将熟悉的方法融和在过程中将你自己的方法配置定义成为你自己的方法框架并且裁减过程。 二、业务驱动开发的原则 业务驱动开发的原则是让软件...

    软件工程-理论与实践(许家珆)习题答案

    总的原则是:至顶而下,逐层分解(画分层数据流图)。 比较复杂的系统不能画在一张纸上,逐层分解的画法可以控制每一层的复杂度。 顶层:将整个系统作为一个加工,描述系统边界(输入与输出)。 中间层:表示某个...

    敏捷软件开发.pdf

    20.3 稳定性:包的耦合性原则 20.4 自顶向下设计 20.5 稳定依赖原则 20.6 稳定抽象原则 20.7 结论 第21章 FACTORY模式 21.1 依赖关系环 21.2 可替换的工厂 21.3 对测试支架使用对象工厂 21.4 使用对象工厂...

    Python第一阶段笔记汇总.docx

    (四)组合复用原则(复用的最佳实践) 96 (五)里氏替换(扩展重写,继承后的重写,指导继承的设计) 96 (六)迪米特法则(用父类减少传递数据量,类与类交互的原则) 97 第三章 模块包+函数式编程 98 通用:快捷键 98...

    论文研究-基于BIP框架的DPU系统建模与验证.pdf

    DPUdata process unit, 数据处理单元是嵌入式系统中的一个典型组件, 被广泛应用于太空领域, 它在层次化的嵌入式系统架构中起到承上启下...实践表明, 该方法具有很好的可复用性和可扩展性, 是确保系统可靠性的有益补充。

    网络编程教程,很好的一本写linux网络编程书,这是我上传的源码

     3.2.3 Internet上两主机进程间通信数据的封装和解包  3.2.4 IP地址、网络地址和网络掩码  3.2.5 传输层端口  3. 3 域名系统  3.4 域名解析和名字服务器  3. 4. 1 TCP协议  3.4.2 TCP的确认...

    先生:适用于Go的功能齐全,由插件驱动的可扩展HTTP客户端工具包

    内置多路复用器,易于组合。 易于通过插件/中间件进行扩展。 能够轻松地即时拦截和修改HTTP流量。 Go的HTTP原语的便捷帮助程序和抽象。 URL模板路径参数。 内置JSON,XML和多部分主体序列化

    Windows Sockets网络编程 总计4个包,part2

    它结合大量示例,对WindowsSockets规范进行了深刻地解读,系统讲解了WindowsSockets网络编程及其相关的概念、原理、主要命令、操作模式,以及开发技巧和可能的陷阱,从程序员的角度给出了大量的建议和最佳实践,是...

    Windows Sockets网络编程 可能是最清晰版本(Windows Sockets 2规范解释小组负责人亲自执笔。)总共4个包,part1

    它结合大量示例,对WindowsSockets规范进行了深刻地解读,系统讲解了WindowsSockets网络编程及其相关的概念、原理、主要命令、操作模式,以及开发技巧和可能的陷阱,从程序员的角度给出了大量的建议和最佳实践,是...

    初级通信专业技术考试大纲

    * multiplexing:了解复用技术的概念与特性、复用技术的目的和基本功能、复用技术的类型 移动通信 * 移动通信基本原理:了解移动通信的基本概念、移动通信的分类、移动通信的特点 * 移动通信演进中的关键技术:...

Global site tag (gtag.js) - Google Analytics