软件设计六大原则

单一职责原则(Single Responsibility Principle)

定义

“Every object should have a single responsibility,and that responsibility should be entirely encapsulated by the class”
一个对象应该只包含一个职责,并且该职责被完整地封装进一个类中。

还有一种我更加喜欢的说法:就一个类而言,应该仅有一个引起它变化的原因。

分析

一个类承担的职责越多,他被复用的可能性就越小,而且如果一个类承担很多职责,就相当于将这些职责耦合在一起,一旦更改一点点需求,就需要更改这个类,从而影响其他职责的运行。
类的职责包括数据职责(属性)和行为职责(方法),如果职责过多,这个系统将会很脆弱,一个职责的修改会影响其他职责,即不同的变化原因被封装同一个类中。

开闭原则(Open-Closed Principle)

定义

“Software entities should be open for extension,but closed fo modofocation”
一个软件实体应当对其扩展开放,对修改关闭。

说简单点,比如设计一个app开发框架,框架的用户是程序员。那么程序员在扩展这个框架的功能的时候,应该能在不修改框架的所有模块的前提下进行。

分析

因为几乎所有的软件设计都面临一个问题,即软件的需求往往随着时间的推移而发生变化。如果一个软件系统不符合开闭原则,那么我们每次给这个系统添加新功能的时候都要修改之前的代码,扩展很不方便。符合开闭原则的代码能使得软件系统有良好的稳定性和延续性。
为了满足开闭原则,一般采取的是抽象化设计。比如一个app框架,有2中button类型,抽象就是在这两种button类型之前设计一个抽象的button,所有形象的button都继承抽象的button。且几乎所有的设计模式都满足开闭原则。

里氏代换原则(Liskov Substitution Principle)

定义

“Function that use pointer or references to base classes must be able to use object of derived classes without knowing it”
所有引用基类(父类)的地方必须能够透明的使用其派生类(子类)的对象

说简单点就是子类一定能实现父类的所用功能。

分析

在里氏代换原则里面,基类和派生类不仅仅是简单的“is a”的关系。派生类应该是基类的扩展,而不应该是基类的特殊化。

这里引用百度百科中的一个例子,对于一个长方形的类,如果它的长和宽相等,那么它就是一个正方形,正方形是特殊的长方形,但是正方形不是长方形的子类。它和长方形之间不符合里氏代换原则。
如果长方形类有setWidth,setHeight和getWidth,getHeight函数,我们让正方形类继承自长方形类,然后重载setWidth,setHeight和getWidth,getHeight函数,保证width和height相等。假设一个客户端使用长方形类,用来保存工厂生产的液晶屏的宽和高,然后我们把这里的长方形类换成正方形类,我们会惊讶的发现这个工厂生产出的所有的液晶屏都是方(正方形)的。显然正方形类不能完全的替换长方形类,这不满足里氏代换原则。
这个时候我们就应该写一个抽象的四边形类,然正方形和长方形类都继承自这个类,四边形类只有width,height,get方法,没有set方法。这样就能满足里氏代换原则。

依赖倒置原则(Dependence Inversion Inversion Principle)

定义

"High level modules should not depend ipon low level modules,both should depend upon abstractions.stractions should not depend upon details,details should depend upon abstractions"
高层模块不应该依赖低层模块,他们都应该依赖抽象。抽象不应该依赖细节,细节应该依赖抽象。

分析

依赖倒置原则要求软件系统是依赖接口编程,不要依赖具体的实现。设计模式中的桥模式就是对依赖倒置原则很好的体现,具体的模板方法模式可以去看我之前的博客。

接口隔离原则(Interface Segregation Principle)

定义

"Clients should not forced to depend upon interfaces that they do not use"
客户端不需要提供那些它不需要的接口

分析

接口隔离既指客户端只提供接口,不提供实现,把客户端内部的行为隐藏起来;又指客户端提供尽量少的专门的接口,各个接口的功能相互独立,互不干涉,一个接口只干一件事。

合成复用原则(Composite Reuse Principle)

定义

“Favor composition of objects over inheritance as a reuse mechanism"
尽量使用对象的组合,而不是继承来达到复用的目的。

分析

因为父类对子类是透明的,子类可以看到父类的细节,破坏了封装性,继承复用叫”白箱“复用;而且子类父类耦合度高,父类发生改变的时候子类往往也需要改变,不利于维护。 继承实在编译期间完成的,灵活度较低。

如果使用组合,就能维持类的封装性。保持一个类发生改变的时候不影响其他类,利于维护和修改需求。组合是”黑箱“复用;而且组合可以在运行期发生改变,灵活度高。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值