`

一些常用的软件设计原则

阅读更多

在架构设计过程中,了解一些先辈们总结出来的常用的设计原则非常有用,在实践过程中,结合这些理论,相信架构水平会有质的提升,就像是一本武功秘籍,在学的过程中遵循它的rule,你的武功自然就上去了。我真的感觉这些原则非常有用:


1.Don't Repeat Yourself

在上一篇已经有阐述。

 

2.面向接口编程而不是面向实现的编程

接口是稳定的,也是抽象的,越抽象的东西越易于扩展,这个是铁的事实。IOC近几年为什么那么盛行,当然有它的道理:在实际代码中,只有接口,具体的实现有IOC容器去注入,我可以灵活地注入想要的任何实现,想换个实现也很容易,客户端调用代码根本不需要改动,这样多好。面向接口编程解除了client代码与实际实现类的耦合。

 

3.避免过度设计(You ain't gonna need it)

设计时,只考虑设计必须的功能,避免过度设计。只实现目前需要的功能,需要时你在添加。

WebSphere的设计者就表示过他过度设计了这个产品 。我们的程序员或是架构师在设计系统的时候,会考虑很多扩展性的东西,导致在架构与设计方面使用了大量折衷,最后导致项目失败。这是个令人感到讽刺的教训,因为本来希望尽可能延长项目的生命周期,结果反而缩短了生命周期。

 

4.迪米特原则(最小知识原则)

这个原则在讲Facade原则时,有提到,最小知识原则,顾名思义就是在设计过程中,避免给用户复杂的调用和使用关系,给用户呈现的东西越简单越好,Facade模式通过迪米特原则,可以减少了客户端代码和底层实现类之间复杂的耦合关系,尤其在软件系统与子系统之间存在复杂的交互关系时,迪米特原则显得很重要。

 

例如:

final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();

这么长的一串对其它对象的细节,以及细节的细节,细节的细节的细节……的调用,增加了耦合,使得代码结构复杂、僵化,难以扩展和维护。

 

5.面向对象5大设计原则之-Single Responsibility Principle (SRP) – 职责单一原则

关于单一职责原则,其核心的思想是:一个类,只做一件事,并把这件事做好,其只有一个引起它变化的原因 。单一职责原则 可以看作是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。职责过多,可能引起它变化的原因就越 多,这将导致职责依赖,相互之间就产生影响,从而极大的损伤其内聚性和耦合度。单一职责,通常意味着单一的功能,因此不要为一个模块实现过多的功能点,以 保证实体只有一个引起它变化的原因。

 

6.面向对象5大设计原则之 -Open/Closed Principle (OCP) – 开闭原则

关于开发封闭原则,其核心的思想是:模块是可扩展的,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的

对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。

 

7.面向对象5大设计原则之 - 里氏替换原则

子类必须能够替换成它们的基类。即:子类应该可以替换任何基类能够出现的地方,并且经过替换以后,代码还能正常工作。另外,不应该在代码中出现 if/else之类对子类类型进行判断的条件。里氏替换原则LSP是使代码符合开闭原则的一个重要保证。正是由于子类型的可替换性才使得父类型的模块在无 需修改的情况下就可以扩展。

 

8.面向对象5大设计原则之 - Interface Segregation Principle (ISP) – 接口隔离原则

接口隔离原则意思是把功能实现在接口中,而不是类中,使用多个专门的接口比使用单一的总接口要好。

举个例子,我们对电脑有不同的使用方式,比如:写作,通讯,看电影,打游戏,上网,编程,计算,数据等,如果我们把这些功能都声明在电脑的抽类里 面,那么,我们的上网本,PC机,服务器,笔记本的实现类都要实现所有的这些接口,这就显得太复杂了。所以,我们可以把其这些功能接口隔离开来,比如:工 作学习接口,编程开发接口,上网娱乐接口,计算和数据服务接口,这样,我们的不同功能的电脑就可以有所选择地继承这些接口。

这个原则可以提升我们“搭积木式”的软件开发。对于设计来说,Java中的各种Event Listener和Adapter,对于软件开发来说,不同的用户权限有不同的功能,不同的版本有不同的功能,都是这个原则的应用。

 

9.面向对象5大设计原则之 - Dependency Inversion Principle (DIP) – 依赖倒置原则

高层模块不应该依赖于低层模块的实现,而是依赖于高层抽象。

举个例子,墙面的开关不应该依赖于电灯的开关实现,而是应该依赖于一个抽象的开关的标准接口,这样,当我们扩展程序的时候,我们的开关同样可以控 制其它不同的灯,甚至不同的电器。也就是说,电灯和其它电器继承并实现我们的标准开关接口,而我们的开关产商就可不需要关于其要控制什么样的设备,只需要 关心那个标准的开关标准。这就是依赖倒置原则。

这就好像浏览器并不依赖于后面的web服务器,其只依赖于HTTP协议。这个原则实在是太重要了,社会的分工化,标准化都是这个设计原则的体现。

 

10.共同封闭原则

一个包中所有的类应该对同一种类型的变化关闭。一个变化影响一个包,便影响了包中所有的类。一个更简短的说法是:一起修改的类,应该组合在一起(同一个包 里)。如果必须修改应用程序里的代码,我们希望所有的修改都发生在一个包里(修改关闭),而不是遍布在很多包里。CCP原则就是把因为某个同样的原因而需 要修改的所有类组合进一个包里。如果2个类从物理上或者从概念上联系得非常紧密,它们通常一起发生改变,那么它们应该属于同一个包。

CCP延伸了开闭原则(OCP)的“关闭”概念,当因为某个原因需要修改时,把需要修改的范围限制在一个最小范围内的包里。


11.共同重用原则

包的所有类被一起重用。如果你重用了其中的一个类,就重用全部。换个说法是,没有被一起重用的类不应该被组合在一起。CRP原则帮助我们决定哪些类应该被 放到同一个包里。依赖一个包就是依赖这个包所包含的一切。当一个包发生了改变,并发布新的版本,使用这个包的所有用户都必须在新的包环境下验证他们的工 作,即使被他们使用的部分没有发生任何改变。因为如果包中包含有未被使用的类,即使用户不关心该类是否改变,但用户还是不得不升级该包并对原来的功能加以 重新测试。

 

12.好莱坞原则
好莱坞原则就是一句话——“don’t call us, we’ll call you.”。意思是,好莱坞的经纪人们不希望你去联系他们,而是他们会在需要的时候来联系你。也就是说,所有的组件都是被动的,所有的组件初始化和调用都 由容器负责。组件处在一个容器当中,由容器负责管理。

简单的来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:

1.不创建对象,而是描述创建对象的方式。
2.在代码中,对象与服务没有直接联系,而是容器负责将这些联系在一起。

控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。

好莱坞原则就是IoC(Inversion of Control)或DI(Dependency Injection )的基础原则。这个原则很像依赖倒置原则,依赖接口,而不是实例,但是这个原则要解决的是怎么把这个实例传入调用类中?你可能把其声明成成员,你可以通过 构造函数,你可以通过函数参数。但是 IoC可以让你通过配置文件,一个由Service Container 读取的配置文件来产生实际配置的类。但是程序也有可能变得不易读了,程序的性能也有可能还会下降。

 

分享到:
评论

相关推荐

    一些软件设计的原则一些软件设计的原则

    以下是一些关键的软件设计原则,它们不仅适用于编程,还能应用于更广泛的生产活动和生活。 1. **Don’t Repeat Yourself (DRY)** DRY原则强调避免重复代码,鼓励代码重用。当发现代码中有重复的部分时,应提取公共...

    软件设计的常用原则ppt

    软件设计的常用原则ppt 软件设计的常用原则ppt

    软件设计原则与实践

    总结来说,软件设计原则在嵌入式领域的应用,要求开发者在设计和实现时考虑系统的可维护性、可扩展性和复用性。通过合理应用开闭原则、单一职责原则、模块化、依赖倒置原则、设计模式以及代码结构的继承和抽象,可以...

    软件设计的七大原则.doc

    软件设计的七大原则是软件设计的精髓所在,这七大原则分别是开闭原则、里氏代换原则、依赖倒置原则、接口隔离原则、合成/聚合复用原则、迪米特法则和抽象类原则。 一、 开闭原则(OCP) 开闭原则是指一个软件实体...

    软件设计6原则

    为了达到这样的设计目标,业界总结了一系列设计原则,这些原则被统称为“软件设计6原则”,它们分别是:单一责任原则(Single Responsibility Principle,简称SRP)、开放封闭原则(Open/Closed Principle,简称OCP...

    软件开发设计原则

    软件开发设计原则是指在软件开发过程中所遵循的一些基本原则,这些原则可以帮助开发者编写出更加灵活、可维护、可扩展的代码。这些原则包括单一职责原则、开放封闭原则、里氏替换原则、最少知识原则、接口隔离原则和...

    软件工程与软件系统设计原则.pptx

    #### 第三章:软件设计原则 **设计原则的重要性:** 良好的设计原则对于构建高质量、可维护的软件至关重要。它们帮助开发者: - **优化软件架构:**确保系统结构合理,易于理解和扩展。 - **提高代码质量:**促进...

    软件设计原则-面向对象设计七大原则.zip

    软件设计原则-面向对象设计七大原则.zip 面向对象和C语言完全不是一种思考问题的方式,面向对象是种哲学思想,只有明白了其核心思想,才能以不变应万变 只有吃透面向对象的七大设计原则,比如:依赖倒置原则,迪米特法则等...

    软件界面设计和易用性基本原则.doc

    (一)审美上令人愉悦:软件界面设计应该考虑到审美因素,通过图形设计原则制造感染力,提供有意义的对比,创建分组,对其界面元素和分组,提供 3D 外观等。 (二)清晰准确、易理解的语言文字:软件界面设计应该...

    软件设计文档SDS.pdf

    2. 软件设计的原则:软件设计应遵循一些基本原则,如模块化、抽象化、封装、继承和多态等。这些原则可以帮助软件设计者创建出更加灵活、可维护和可扩展的软件系统。 3. 软件设计模式:软件设计模式是指在软件设计中...

    设计模式——6大软件设计原则(demo案例实现,附带解析,快速掌握软件设计原则的精髓)

    该包下的所有demo都是一个个的软件设计原则的案例实现 包含有: 1、开闭原则 2、里氏代换原则 3、依赖倒转原则 4、接口隔离原则 5、迪米特法则 6、合成复用原则 使用了一个个的demo案例,以通俗易懂的生活...

    软件设计的七大原则

    软件设计的七大原则 软件设计的七大原则是软件设计的基本原则,旨在指导软件模块的开发和扩展。这些原则包括开闭原则、里氏代换原则、依赖倒置原则、接口隔离原则、合成/聚合复用原则、迪米特法则和抽象类原则。...

    软件体系结构七大设计原则

    软件体系结构七大设计原则是构建高质量软件系统的基础,它们分别是:单一职责原则、开闭原则、里氏代换原则、依赖倒转原则、接口隔离原则、迪米特法则和合成聚合原则。这些原则旨在提高软件的可维护性、可扩展性和可...

    软件设计的七大原则(OOD)

    软件设计的七大原则(OOD) software设计的七大原则是指在...软件设计的七大原则是软件设计中的一些基本原则,遵守这些原则可以提高软件的可复用性、灵活性、可扩展性和可维护性,减少软件系统的耦合度和错误概率。

    软件设计的基本原则说明

    8. 方案生命周期长设计原则:软件设计应考虑到整个生命周期,能够满足业务需求和用户需求。 在软件设计过程中,需要遵循这些基本原则,以确保软件的质量、效率和可维护性。而且,软件设计也需要考虑到业务发展的...

    软件工程-软件设计概述

    软件工程中的软件设计是将分析模型转化为实际的软件实施方案的过程,它是从软件需求阶段过渡到实现阶段的关键步骤。...通过理解和应用这些设计原则和概念,软件工程师可以创建出高效、可靠和易于维护的软件系统。

Global site tag (gtag.js) - Google Analytics