新手快速自学软件开发的详细步骤 软件设计开发怎么样( 三 )


由于需求的变化,系统可能需要添加新的数据源或新的文件格式 。每次添加新类型的数据源或文件格式时,客户端类MainClass都需要修改源代码才能使用新类,但这违背了开放封闭原则 。现在我们用依赖倒置的原理来重构它 。点击此处查看9个高可用性架构设计方案的详细说明 。
当然根据具体的情况,也可以将AbstractSource注入到AbstractStransformer,依赖注入的方式有以下三种:abstract class AbstractStransformer { private AbstractSource source; public void AbstractStransformer(AbstractSource source){ this.source = source; } public void setSource(AbstractSource source) { this.source = source; } public void transform(AbstractSource source ) { source.getSource(); System.out.println("Stransforming ..."); } } 合成/聚合重用原则
(复合/聚合复用原则(CARP):尽量用对象组合代替继承关系,达到软件复用的目的 。
定义
通常被称为复合重用原则(Composite ReusePrinciple)或CRP,我们试图使用对象组合而不是继承来达到重用的目的 。
就是在一个新对象中使用一些已有的对象,使其成为新对象的一部分;新对象通过委托给这些对象来实现重用现有功能的目的 。总之,尽量用合成/聚合,尽量不用继承 。
原理分析
1)在面向对象设计中,现有的设计和实现可以通过两种基本方法在不同的环境中重用,即通过组合/聚合关系或通过继承 。
重用:实现简单,易于扩展 。破坏系统的封装;从基类继承的实现是静态的,不能在运行时改变,并且不够灵活;只能在有限的环境下使用 。(“白盒”重用)
组合/聚合复用:耦合度比较低,选择性调用成员对象的操作;这可以在运行时动态完成 。(“黑盒”多路复用)
2)组合/聚合可以使系统更加灵活,降低类之间的耦合度,一个类的变化对其他类的影响相对较小,因此一般首选组合/聚合来实现重用;其次要考虑传承 。在使用继承时,要严格遵循李希特的替代原则 。有效利用继承有助于理解问题,降低复杂性,而滥用继承会增加系统构建和维护的难度,增加系统的复杂性 。因此,我们需要谨慎使用继承重用 。
3)这个原则和李希特的替代原则是相辅相成的,两者都是“开闭”原则具体实现的规范 。如果我们违背了这个原则,我们就无法实现“开-闭”原则 。首先,我们要理解合成和聚合的概念:
注意:聚合和组合有什么区别?综合(组合):表示整体与部分的关系,指存在于整体上的关系(整体与部分不可分离);例如,眼睛和嘴是头部的组合关系 。没有头,就没有眼睛和嘴巴,两者密不可分 。在UML中,组合关系用带实心菱形的直线来表示 。聚合:聚合是比复合关系更强的依赖关系,也表示整体和部分的关系(整体和部分可以分开);比如螺丝和汽车玩具的关系,螺丝分离的玩具仍然可以在其他设备上使用 。在UML中,聚合关系用一条带菱形空中心的直线来表示 。
迪米特里定律
(Demeter定律,LoD:系统中的类,尽量不要和其他类交互,减少类之间的耦合 。
定义
也被称为最少知识原则(或简称LKP)的几个正式定义:
不要和“陌生人”说话 。英文定义为:Don’t talk to strangers. 只与你的直接朋友通信 。英文定义为:Talk only to your immediate friends. 每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位 。简单地说,一个对象应该尽可能少地了解其他对象 。一个类应该对它需要耦合或调用的类了解最少 。你(耦合或称类)内部有多复杂对我来说无所谓 。那是你的事 。我知道你提供的public方法,就这么叫吧 。其他的我都不在乎 。
规则分析
朋友类:在德米特里定律中,对于一个物体来说,它的朋友包括以下几类:(1)当前物体本身(this);(2)对象以参数的形式传入当前对象方法;(3)当前对象的成员对象;(4)如果当前对象的成员对象是集合,那么集合中的所有元素都是朋友;(5)当前对象创建的对象 。
任何一个对象,如果满足以上条件之一,就是当前对象的“朋友”,否则就是“陌生人” 。
狭义法则和广义法则:在狭义的迪米特里定律中,如果两个阶级之间不必直接交流,那么这两个阶级之间就不应该有直接的互动 。如果其中一个类需要调用另一个类的方法,可以由第三方转发 。
狭义的迪米特定律:可以降低类之间的耦合,但是会给系统增加大量的小方法,分散在系统的各个角落 。它可以简化一个系统的局部设计,因为每个部分都不会与远处的物体直接相关,但它也会降低系统不同模块之间的通信效率,使系统不同模块之间难以协调 。点击此处查看9个高可用性架构设计方案的详细说明 。


推荐阅读