单一原则
概念:一个类被改变的原因不能超过一个,也就是说,一个类只有一个职责。
如果职责过多,代码就会臃肿,可读性更差,也更难以维护。其实上单一职责原则和接口隔离原则有一定的关系,接口隔离以后,职责就单一了,实现这个接口的类的职责自然也就单一了。但是接口隔离关注的是抽象层,单一职责关注的是两者兼而有之,偏重于实现。
然而在现实中,我们的代码想实现单一原则是很难的。而且每个人对类定义的理解不同也会有一定的定义方式不同。比如说:打电话功能,我们在这里一个类中是否要定义拨号,通话,结束会话都在一起呢?还是说我们都单独定义类来实现不用的方法。还有在django中一个类接口实现了增删改查,那么为什么不单独定义呢,是不是不符合咱们的单一原则了?
因此,在我们实现接口的时候要尽量的单一,然而对于类的时候就要按照实际情况而定了。在对数据库操作一般是增删改查,那么我们没有必要分开了。
那么单一原则有哪些好处呢?
1、提高类的可维护性和可读写性
一个类的职责少了,复杂度降低了,代码就少了,可读性也就好了,可维护性自然就高了。
2、提高系统的可维护性
系统是由类组成的,每个类的可维护性高,相对来讲整个系统的可维护性就高。当然,前提是系统的架构没有问题。
3、降低变更的风险
一个类的职责越多,变更的可能性就更大,变更带来的风险也就越大。
如何实现单一原则?
简单来说就是一个类只完成一个功能
里式替换原则
概念:子类可以扩展父类的功能,但不能改变父类原有的功能。在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,反过来则不成立,如果一个软件实体使用的是一个子类对象的话,那么它不一定能够使用基类对象。
类是可以继承的,当子类继承父类后,会继承父类的所有属性和方法,我们子类不修改父类的原有功能,那么我们在一定条件下使用父类后,然后将使用的父类修改为子类。我们的程序是不会出现错误的。
里氏替换原则包含的含义
1、子类可以实现父类的抽象方法,但是不能覆盖父类的非抽象方法
在我们做系统设计时,经常会设计接口或抽象类,然后由子类来实现抽象方法,这里使用的其实就是里氏替换原则。子类可以实现父类的抽象方法很好理解,事实上,子类也必须完全实现父类的抽象方法,哪怕写一个空方法,否则会编译报错。
里氏替换原则的关键点在于不能覆盖父类的非抽象方法。父类中凡是已经实现好的方法,实际上是在设定一系列的规范和契约,虽然它不强制要求所有的子类必须遵从这些规范,但是如果子类对这些非抽象方法任意修改,就会对整个继承体系造成破坏。而里氏替换原则就是表达了这一层含义。
2、子类中可以增加自己特有的方法
在继承父类属性和方法的同时,每个子类也都可以有自己的个性,在父类的基础上扩展自己的功能。前面其实已经提到,当功能扩展时,子类尽量不要重写父类的方法,而是另写一个方法
3、当子类覆盖或实现父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松
简单来讲就是:子类可以继承父类,但是我们不能修改父类和原有的功能。我们只能使用它,扩展父类的方法。
依赖倒置原则
定义:1、上层模块不应该依赖底层模块,它们都应该依赖于抽象。
2、抽象不应该依赖于细节,细节应该依赖于抽象。
比如说一个汽车厂,开始的时候可以生产大众、奥迪。那么大众奥迪都是依赖于我们的汽车厂。后期如果厂子做大了,生产其他的汽车,那么其他的汽车也是依赖于我们的汽车厂,我们的汽车就是底层模块,汽车厂就是上层模块。也就是,你可以不用我,要是使用我就符合我的规则。
迪米法特原则
概念:一个对象应该对其他对象有最少的了解,所以迪米特法则又叫做最少知识原则。
迪米特法则的意义在于降低类之间的耦合。由于每个对象尽量减少对其他对象的了解,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。
比如说一台计算机 ,里面有主板、cpu、内存、硬盘等。还有外设键盘、鼠标、显示器等。那么我们想要生产一台电脑,那么我们需要都加工么?做主板的七彩虹需要知道因特尔cpu是如何生产的么?他们只需要知道接口就可以了。
开闭原则
概念:开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简单来说:就是为了使程序的扩展性好,易于维护和升级。减低耦合性
1、只要是面向对象的编程,在开发过程中都会强调开闭原则
2、是最基础的设计原则,其他五个设计原则都是开闭原则的具体形态
3、可以提高代码的复用性
4、可以提高代码的可维护性
网友评论