一:单一职责准绳(Single Responsibility Principle, SRP)
1、定义:一个对象应该只包含单一的职责,而且该职责被完整地封装在一个类中
或许:就一个类而言,应该唯一一个引发它变化的缘由。
2、剖析:一个类(或许大到模块,小到要领)负担的职责越多,它被复用的可能性越小,而且假如一个类负担的职责过量,就相当于将这些职责耦合在一起,当个中一个职责变化时,可能会影响其他职责的运作。 类的职责主要包含两个方面:数据职责和行动职责,数据职责经由过程其属性来表现,而行动职责经由过程其要领来表现。 单一职责准绳是完成高内聚、低耦合的指导方针,在许多代码重构手腕中都能找到它的存在,它是最简朴但又最难应用的准绳,须要设想职员发明类的差别职责并将其星散,而发明类的多重职责须要设想职员具有较强的剖析设想能力和相干重构履历。
3、实例:
实例申明 某基于Java的C/S体系的“登录功用”经由过程以下登录类(Login)完成:
现运用单一职责准绳对其举行重构。
二:开闭准绳(Open-Closed Principle, OCP)
1、定义:一个软件实体应该对扩大开放,对修正封闭。也就是说在设想一个模块的时刻,应该使这个模块可以在不被修正的前提下被扩大,即完成在不修正源代码的情况下转变这个模块的行动。
2、剖析:开闭准绳由Bertrand Meyer于1988年提出,它是面向对象设想中最主要的准绳之一。在开闭准绳的定义中,软件实体可以指一个软件模块、一个由多个类构成的部分组织或一个自力的类。笼统化是开闭准绳的症结。 开闭准绳还可以经由过程一个越发细致的“对可变性封装准绳”来形貌,对可变性封装准绳(Principle of Encapsulation of Variation, EVP)请求找到体系的可变要素并将其封装起来。
三:里氏代换准绳(Liskov Substitution Principle, LSP)
1、定义:假如对每一个范例为S的对象o1,都有范例为T的对象o2,使得以T定义的一切顺序P在一切的对象o1都代换成o2时,顺序P的行动没有变化,那末范例S是范例T的子范例
或许:一切援用基类(父类)的处所必需能透明地运用其子类的对象。
2、剖析:里氏代换准绳由2008年图灵奖得主、美国第一位计算机科学女博士、麻省理工学院传授Barbara Liskov和卡内基.梅隆大学Jeannette Wing传授于1994年提出。
里氏代换准绳可以浅显表述为:在软件中假如可以运用基类对象,那末肯定可以运用其子类对象。把基类都替代成它的子类,顺序将不会发作任何毛病和非常,反过来则不建立,假如一个软件实体运用的是一个子类的话,那末它不肯定可以运用基类。里氏代换准绳是完成开闭准绳的主要体式格局之一,因为运用基类对象的处所都可以运用子类对象,因而在顺序中只管运用基类范例来对对象举行定义,而在运行时再肯定其子类范例,用子类对象来替代父类对象。
四:依靠倒转准绳(Dependence Inversion Principle, DIP)
1、定义:高层模块不应该依靠低层模块,它们都应该依靠笼统。笼统不应该依靠于细节,细节应该依靠于笼统
或许:要针对接口编程,不要针对完成编程。(Program to an interface, not an implementation.)
2、剖析:依靠倒转准绳是Robert C. Martin在1996年为《C++ Reporter》所写的专栏Engineering Notebook的第三篇,厥后到场到他在2002年出书的经典著作《Agile Software Development, Principles, Patterns, and Practices》中。
简朴来讲,依靠倒转准绳就是指:代码要依靠于笼统的类,而不要依靠于细致的类;要针对接口或笼统类编程,而不是针对细致类编程。 完成开闭准绳的症结是笼统化,而且从笼统化导出细致化完成,假如说开闭准绳是面向对象设想的目标的话,那末依靠倒转准绳就是面向对象设想的主要手腕。
依靠倒转准绳的经常使用完成体式格局之一是在代码中运用笼统类,而将细致类放在配置文件中。
类之间的耦合
零耦合关联
细致耦合关联
笼统耦合关联
依靠倒转准绳请求客户端依靠于笼统耦合,以笼统体式格局耦合是依靠倒转准绳的症结。
依靠注入
组织注入(Constructor Injection):经由过程组织函数注入实例变量。
设值注入(Setter Injection):经由过程Setter要领注入实例变量。
接口注入(Interface Injection):经由过程接口要领注入实例变量。
五:接口断绝准绳(Interface Segregation Principle, ISP)
1、定义:客户端不应该依靠那些它不须要的接口 注重,在该定义中的接口指的是所定义的要领。
或许:一旦一个接口太大,则须要将它分割成一些更微小的接口,运用该接口的客户端仅需晓得与之相干的要领即可。
2、剖析:接口断绝准绳是指运用多个特地的接口,而不运用单一的总接口。每一个接口应该负担一种相对自力的角色,不多不少,不干不应干的事,该干的事都要干。
(1) 一个接口就只代表一个角色,每一个角色都有它特定的一个接口,此时这个准绳可以叫做“角色断绝准绳”。
(2) 接口仅仅供应客户端须要的行动,即所需的要领,客户端不须要的行动则隐蔽起来,应该为客户端供应只管小的零丁的接口,而不要供应大的总接口。
运用接口断绝准绳拆分接口时,起首必需满足单一职责准绳,将一组相干的操纵定义在一个接口中,且在满足高内聚的前提下,接口中的要领越少越好。 可以在举行体系设想时采纳定制效劳的体式格局,即为差别的客户端供应宽窄差别的接口,只供应用户须要的行动,而隐蔽用户不须要的行动。
六:合成复用准绳(Composite Reuse Principle, CRP)又称为组合/聚合复用准绳(Composition/ Aggregate Reuse Principle, CARP)
1、定义:只管运用对象组合,而不是继续来到达复用的目标。(Favor composition of objects over inheritance as a reuse mechanism.)
2、剖析:合成复用准绳就是指在一个新的对象里经由过程关联关联(包含组合关联和聚合关联)来运用一些已有的对象,使之成为新对象的一部分;新对象经由过程委派挪用已有对象的要领到达复用其已有功用的目标。简言之:要只管运用组合/聚合关联,罕用继续。
在面向对象设想中,可以经由过程两种基础要领在差别的环境中复用已有的设想和完成,即经由过程组合/聚合关联或经由过程继续。
继续复用:完成简朴,易于扩大。损坏体系的封装性;从基类继续而来的完成是静态的,不可能在运行时发作转变,没有充足的天真性;只能在有限的环境中运用。(“白箱”复用 )
组合/聚合复用:耦合度相对较低,挑选性地挪用成员对象的操纵;可以在运行时动态举行。(“黑箱”复用 )
组合/聚合可以使体系越发天真,类与类之间的耦合度下降,一个类的变化对其他类形成的影响相对较少,因而平常首选运用组合/聚合来完成复用;其次才斟酌继续,在运用继续时,须要严厉遵照里氏代换准绳,有用运用继续会有助于对题目的明白,下降复杂度,而滥用继续反而会增添体系构建和保护的难度以及体系的复杂度,因而须要郑重运用继续复用。
七:迪米特轨则(Law of Demeter, LoD)又称为起码学问准绳(Least Knowledge Principle, LKP)
1、定义:
(1) 不要和“陌生人”措辞。英文定义为:Don't talk to strangers.
(2) 只与你的直接朋侪通讯。英文定义为:Talk only to your immediate friends.
(3) 每一个软件单元对其他的单元都只要起码的学问,而且局限于那些与本单元密切相干的软件单元。英文定义为:Each unit should have only limited knowledge about other units: only units "closely" related to the current unit.
2、剖析:迪米特轨则来自于1987年秋美国东北大学(Northeastern University)一个名为“Demeter”的研讨项目。简朴地说,迪米特轨则就是指一个软件实体应该只管少的与其他实体发作相互作用。如许,当一个模块修正时,就会只管少的影响其他的模块,扩大会相对轻易,这是对软件实体之间通讯的限定,它请求限定软件实体之间通讯的宽度和深度。
以上就是C#中面向对象设想七个准绳引见的细致内容,更多请关注ki4网别的相干文章!