今天的设计原则重理论,举例子只能是文字形式,没法使用代码解释,希望大家可以多读几遍。真正体会到设计原则的好处。每一个设计原则,我都尽量用非术语的话大白话再给 大家说一下,如果还不明白,可私信我。
定义:一个整体的软件实例,类或者接口等应该保持对修改封闭,对扩展开放的设计思想。
大白话:其实这原则还是比较容易理解的,就是对类、接口之类的尽量设计的足够好,好到不需要去动他的核心逻辑,如果遇到需求增加,那么可以通过扩展来增强功能即可,增加一个类就可以解决你以后的业务处理,这就是开放封闭原则。
定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,那么类型 T2 是类型 T1 的子类型。
定义2:子类型必须能够替换掉它们的父类型。
大白话:在软件里面,把父类都替换成它的子类,程序的行为没有变化,子类可以扩展父类,但是父类的原有行为不能改变。正是由于子类型的可替换性才使得使用父类类型的模块在无需修改的情况下就可以扩展,不然还谈什么扩展开放,修改关闭呢
定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。即针对接口编程,不要针对实现编程。
大白话:依赖倒转的原则就是,谁也不要依靠谁,大家都是一个独立的,我们 统一面对的是接口、抽象类,我们程序中所有的依赖关系最终应该是接口或者抽象类,那就是面向对象开发,如果不是那就是过程式开发。无论哪种语言,都应该考虑是面对抽象编程,而不是面对细节编程。
在实际编程中,我们一般需要做到如下3点:
低层模块尽量都要有抽象类或接口,或者两者都有。
变量的声明类型尽量是抽象类或接口。
使用继承时遵循里氏替换原则。
定义:建立单一接口,不要建立庞大臃肿的接口,尽量细化接口,接口中的方法尽量少。也就是说,我们要为各个类建立专用的接口,而不要试图去建立一个很庞大的接口供所有依赖它的类去调用。在程序设计中,依赖几个专用的接口要比依赖一个综合的接口更灵活。接口是设计时对外部设定的“契约”,通过分散定义多个接口,可以预防外来变更的扩散,提高系统的灵活性和可维护性。
大白话:接口隔离就是尽量把接口进行细分,接口尽量做得小一些,但也不是太小,接口的大小把握好力度,同时把调用类需要的结构暴露出来,不需要的要隐藏好,并且要提高内聚,降低耦合,设计接口要多花时间去琢磨,尽量控制好接口的大小跟功能范围。
定义:在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分:新的对象通过向这些对象的委派达到复用已有功能的目的。
大白话:其实理解这个原则,可以先了解aop,aop面向切面编程,目的就是为了从广度上增强项目功能,而不是靠继承从深度上实现功能,这个原则的目的也是,尽量避免使用继承从而增加代码的复杂性,降低可维护性,组合复用就是尽量减少依赖,但是增加了对象调用,系统将会增加管理对象的负担,所以该原则也不是必须的,各位根据自己的情况自己评估。
定义:强调了类之间的松耦合,类之间的耦合越弱,越有利于复用,一个处在弱耦合的类被修改,不会对有关系的类造成影响
大白话:我们以前一直接触的一个词叫做高内聚低耦合,目的就是降低类与类之间的耦合程度,该类的修改不会影响到其他类,保障一个被依赖的类最少的暴露结构,除了public,其他的都应该隐藏,再难的逻辑也应该是依赖类自己完成,不要暴露给其他类,让依赖的类知道的越少越好。
定义:不要存在多于一个导致类变更的原因。
大白话:如果前面的都能理解了,那么这个就很容易了,通俗的说,即一个类只负责一项职责,应该仅有一个引起它变化的原因。
学而时习之,温故而知新,望大家多回头看看以前的系列文章。