软件设计中经常用到的设计原则小结

开放-封闭原则

说的是软件实体(类,模块,函数等等)应该可以扩展,但是不可修改。

这个原则有两个特征:(1)对于扩展是开放的(2)对于更改是封闭的。

说白了就是设计软件要容易维护又不容易出问题的最好办法就是多扩展,少修改。

开放-封闭原则是面向对象的设计的核心所在,遵循这个原则可以带来面向对象技术所声称的巨大的好处,也就是可维护,可扩展,可复用,灵活性好。开发人员应该仅对程序中呈现出频繁变化的那部分作出抽象,然而,不要对每个地方都可以的抽象,要拒绝不成熟的抽象,要掌握一个度。

高内聚,低耦合原则

图片来自 络

首先先说一下什么是内聚,什么是耦合:

百度百科中说:

内聚是从功能角度来度量模块内的联系,一个好的内聚模块应当恰好做一件事。它描述的是模块内的功能联系;

耦合是软件结构中各模块之间相互连接的一种度量,耦合强弱取决于模块间接口的复杂程度、进入或访问一个模块的点以及通过接口的数据。

所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。

对于低耦合,粗浅的理解是:一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。这样有利于修改和组合。

依赖倒转原则

包含两个方面:

1.高层模块不应该依赖低层模块,两个都应该依赖抽象

2.抽象不应该依赖细节,但是细节应该依赖抽象

图片来自 络

下面解释一下,这个比较难理解,我们在开发过程中,为了使得常用的代码可以复用,一般会把这些代码写成许许多多的函数的程序库,比如Math等。这样我们在做新的项目的时候,直接去掉用这些底层的函数就可以了,比如我们好多项目都是要连接数据库的,我们把连接数据库的代码写成函数,这样,每次做新项目的时候,我们就能直接调用,这就叫做高层模块依赖底层模块,注意,我们的原则中是不应依赖,这是怎么回事呢,请往下看:

我们做好了一个项目,但是客户要求更换数据库,这时候麻烦就来了,高层模块和底层模块是耦合在一块的,耦合度非常的高,所以我们几乎就没有办法了,然而我们让它依赖抽象的时候我们就可以直接更换数据库,这样高层模块就不会受到影响了,耦合度变的很低,这就是为什么我们一定要依赖抽象,而不是高层和底层互相依赖。

结论:如果不管高层模块和底层模块,他们都依赖于抽象,具体一点就是接口或者抽象类,只要接口是稳定的,那么任何一个更改都不用担心其他受到影响。这就使得无论高层模块或者低层模块都可以很容易的被复用。

读到这里读者可能又有了一个疑问:为什么依赖了抽象的接口或者抽象类就不怕更改呢。好往下看我们又引出了一个原则:里氏代换原则

里氏代换原则

子类型必须能替换掉他的父类型,也就是说在软件里边,把父类都替换成他的子类,程序的行为没有发生变化。

解释一下:只有当子类可以替换掉父类的时候软件单位的功能不受到影响的时候,父类才能真正的被复用,而子类也能够在父类的基础上增加新的行为。

图片来自 络

举个例子:有一个动物的接口,包含吃,喝,跑 三个方法。我们可以知道,猫,狗,牛,羊都可以继承动物类,而且完全继承了吃喝跑三个方法,这样需求的变化使得 猫更换为牛羊狗,程序的其他地方不需要改变,所以由于有了里氏代换原则才使得开放-封闭功能成为了可能。这么说是因为 由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展。

依赖倒转其实可以说是面向对象设计的标志:用哪种语言来编写程序并不重要,如果编写时考虑的都是如何针对抽象变成而不是针对细节编程,即程序中所有的依赖关系都是终止于抽象类或者接口,那就是面向对象的设计,反之那就是过程化的设计了。

以上部分内容是借鉴自程杰《大话设计模式一书》,这本书写的非常棒,也希望大家买来仔细研读,定会收获颇丰的。

当然设计原则还有好多,我暂时就介绍这几种,欢迎大家补充。

如果觉得我的文章对你有帮助,请关注,会有更好的文章。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2016年11月13日
下一篇 2016年11月15日

相关推荐