资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,常见面对对象设计原则,引言,设计原则是思想上的指导,设计模式是实现上的手段,设计模式是设计原则的具体表达,在实际开发中,很少做到完全遵守,总是在有意无意的违反一些或者局部原则,设计是一种危急的平衡艺术,单一职责原则,(SRP),Single Responsibility Principle,拍摄,UFO,单一职责原则,就一个类而言,应当仅有一个引起它变化的缘由职责。,假设一个类担当的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会减弱或者抑制这个类完成其他职责的力气。这种耦合会导致脆弱的设计,当变化发生时,设计会患病到意想不到的破坏,难点在于如何区分职责、职责的粒度问题,软件设计真刚要做的内容,就是觉察职责并把那些职责相互分别。,假设你能够想到多于一个的动机去转变一个类,那么这个类就具有多于一个的职责,就应当考虑类的职责分别。,开放-封闭原则OCP原则Open-Closed Principle,开放,-,封闭原则,Open-Closed Principle原则讲的是:一个软件实体应当对扩开放放,对修改关闭。,需要考虑:,怎样的设计才能面对需求的转变却可以保持相对稳定,从而使得系统可以在第一个版本以后不断推出新的版本。,面对需求,对程序的改动是通过增加新的代码进展的,而不是更改现有代码。,例如第一章程序,关键,合理地抽象、分别出变化与不变化的局部,为变化的局部预留下可扩展的方式。例如:钩子方法或是动态组合对象等,要完全遵守开闭原则是不行能的,也没这个必要。适当的抽象可以提高系统的灵敏性、使其可扩展、可维护;过度抽象,会大大增加系统的简洁程度。,例子:,招安,招安之法的关键便是不允许更改现有的秩序,但允许将被招安者纳入现有秩序中,从而扩展了这一秩序。,用面对对象的语言来讲,不允许更改的是系统的抽象层,而允许更改的是系统的实现层。,里氏代换原则,Liskov Substitution Principle,使得开放,-,封闭成为可能,里氏代换原则,里氏代换原则,子类型(subtype)必需能够替换它们的基父类型。子类可以以父类的身份消逝,假设鸟是会飞的,企鹅不会飞,企鹅是鸟吗?,由于子类型的可替换性才使得使用父类型的模块在无需修改的状况下就可以扩展。因此是实现开闭原则的前提之一,依靠倒转置原则(DIP)Dependence Inversion Principle,依靠倒转原则,依靠倒转置Dependence Inversion Principle原则讲的是:要依靠于抽象,不要依靠于具体。,简洁的说,依靠倒转原则要求客户端依靠于抽象耦合。原则表述:,抽象不应当依靠于具体实现;具体实现应当依靠于抽象;,高层模块不应当依靠于底层模块,二者都应当依靠于抽象,要针对接口编程,不针对实现编程。,修电脑得到的启发,强内聚、松耦合,由于PC易插拨的方式,那么不管哪一个出问题,都可以在不影响别的部件的前题下进展修改或替换。”,依靠倒转原则,要针对接口编程,不要对实现编程,无论主板、CPU、内存、硬盘都是在针对接口编程,假设针对实现编程,那就会消逝换内存需要把主板也换了的犯难,常见错误,层次化调用的时候,应当是高层调用“底层所拥有的接口”,这是一典型的误会。,一般高层包含对业务功能的处理和业务策略选择,应当被重用,是高层模块去影响底层的具体实现。,这个底层的接口应当是由高层提出的,然后由底层实现,即底层的接口的全部权在高层模块,是一种全部权的倒置,反面例子,缺点:,耦合太严密,Light发生变化将影响ToggleSwitch。,解决方法一:,将Light作成Abstract,然后具体类继承自Light。,优点:,ToggleSwitch依靠于抽象类Light,具有更高的稳定性,而BulbLight与TubeLight继承自Light,可以依据“开放封闭”原则进展扩展。只要Light不发生变化,BulbLight与TubeLight的变化就不会涉及ToggleSwitch。,缺点:,假设用ToggleSwitch把握一台电视就很困难了。总不能让TV继承自Light吧。,解决方法二:,优点:更为通用、更为稳定。,结论:,使用传统过程化程序设计所创立的依靠关系,策略依靠于细节,这是糟糕的,由于策略受到细节转变的影响。依靠倒置原则使细节和策略都依靠于抽象,抽象的稳定性预备了系统的稳定性。,Hollywood Principle:don”t call us,we”ll call you,合成,/,聚合复用原则,要尽量使用合成/聚合,而不是继承关系到达复用的目的。合成/聚合原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一局部;新的对象通过向这些对象的委派到达复用已有功能的目的。,Favor Composition Over Inheritance,接口隔离原则ISP,接口隔离原则,接口隔离原则Interface Segregation Principle讲的是:使用多个特地的接口比使用单一的总接口要好。换而言之,从一个客户类的角度来讲:一个类对另外一个类的依靠性应当是建立在最小接口上的。,过于臃肿的接口是对接口的污染。不应当强迫客户依靠于它们不用的方法。,实现方法:,使用多重继承分别接口,迪米特法则LoD,迪米特法则Law of Demeter或简写LoD又叫最少学问原则Least Knowledge Principle或简写为LKP,假设两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用。假设其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用。,也就是说,一个对象应当对其它对象有尽可能少的了解。,其它表述,只与你直接的朋友们通信,不要跟“生疏人”说话,每一个软件单位对其它的单位都只有最少的学问,而且局限于那些与本单位亲切相关的软件单位。,迪米特法则其根本思想,是强调了类之间的松耦合。,类之间的耦合越弱,越有利于复用,一个处于弱耦合的类被修改,不会对有关系的类造成涉及。,信息的隐蔽促进了软件的复用。,以史为鉴,使民无知老子第三章曰:“是以圣人之治,虚其心,实其腹,弱其志,常使民无知无欲。”使被“统治”的对象“愚昧”化,处于“无知”的状态,可以使“统治”的本钱降低。,所谓“最少学问“原则,实际上便是老子的“使民无知“的统治之术。,不相往来老子云:“小国寡民邻国相望,鸡犬之声相闻,民至老死,不相往来。”将被统治的对象隔离开来,使它们没有直接的通信,可以到达分化瓦解,继而分而治之的效果。,迪米特法则与老子的“不相往来“的统治之术不谋而合。,单一职责原则,就一个类而言,应当仅有一个引起它变化的缘由。,开放-封闭原则,一个软件实体应当对扩开放放,对修改关闭,里氏代换原则,子类型(subtype)必需能够替换它们的基父类型,依靠倒转置原则,要依靠于抽象,不要依靠于具体,接口隔离原则,使用多个特地的接口比使用单一的总接口总要好,合成/聚合复用原则,要尽量使用合成/聚合,而不是继承关系到达复用的目的,迪米特法则,一个软件实体应当尽可能少的与其他实体发生相互作用,
展开阅读全文