C# · 12月 20, 2021

一、 "开放-封闭"原则(OCP)

 软件腐化的原因:
<p style=”FONT-SIZE: 10pt”>问题所在   设计目标—————————————————————————-过于僵硬   可扩展性(新性能可以很容易加入系统)过于脆弱   灵活性(修改不会波及其它)复用率低   粘度过高   可插入性(新功能容易加入系统(气囊加入方向盘))

<p style=”FONT-SIZE: 10pt”> 提高系统可复用性的几点原则:传统复用:1. 代码的粘帖复用2. 算法的复用3. 数据结构的复用

<p style=”FONT-SIZE: 10pt”> 可维护性与可复用性并不完全一致

<p style=”FONT-SIZE: 10pt”>* 对可维护性的支持:

一、 “开放-封闭”原则(OCP)<p style="FONT-SIZE: 10pt">Open-Closed Principle原则讲的是:一个软件实体应当对扩展开放,对修改关闭。

<p style="FONT-SIZE: 10pt">优点:    通过扩展已有软件系统,可以提供新的行为,以满足对软件的新的需求,使变化中的软件有一定的适应性和灵活性。    已有软件模块,特别是最重要的抽象层模块不能再修改,这使变化中的软件系统有一定的稳定性和延续性。

<p style="FONT-SIZE: 10pt">例子:玉帝招安美猴王当年大闹天宫便是美猴王对玉帝的新挑战。美猴王说:"'皇帝轮流做,明年到我家。'只教他搬出去,将天宫让于我!"对于这项挑战,太白金星给玉皇大帝提出的建议是:"降一道招安圣旨,宣上界来…,一则不劳师动众,二则收仙有道也。"

<p style="FONT-SIZE: 10pt">换而言之,不劳师动众、不破坏天规便是"闭",收仙有道便是"开"。招安之道便是玉帝天庭的"开放-封闭"原则。

<p style="FONT-SIZE: 10pt"> 

<p style="FONT-SIZE: 10pt">招安之法的关键便是不允许更改现有的天庭秩序,但允许将妖猴纳入现有秩序中,从而扩展了这一秩序。用面向对象的语言来讲,不允许更改的是系统的抽象层,而允许更改的是系统的实现层。

二、 里氏代换原则(LSP)<p style="FONT-SIZE: 10pt">Liskov Substitution Principle(里氏代换原则):子类型(subtype)必须能够替换它们的基类型。

<p style="FONT-SIZE: 10pt">白马、黑马 

<p style="FONT-SIZE: 10pt">反过来的代换不成立《墨子·小取》说:"娣,美人也,爱娣,非爱美人也……"娣便是妹妹,哥哥喜爱妹妹,是因为两人是兄妹关系,而不是因为妹妹是个美人。因此,喜爱妹妹不等同于喜爱美人。用面向对象语言描述,美人是基类,妹妹是美人的子类。哥哥作为一个有"喜爱()"方法,接受妹妹作为参数。那么,这个"喜爱()"方法一般不能接受美人的实例。

<p style="FONT-SIZE: 10pt"> 

<p style="FONT-SIZE: 10pt">一个违反LSP的简单例子(长方形和正方形)

<p style="FONT-SIZE: 10pt">正方形不可以做长方形的子类

= r.getWidth() )

<p style="FONT-SIZE: 10pt">代码重构

<p style="FONT-SIZE: 10pt">

<hr id="null">参考文献:<p style="FONT-SIZE: 10pt">

<p style="FONT-SIZE: 10pt">阎宏,《Java与模式》,电子工业出版社

<p style="FONT-SIZE: 10pt">[美]James W. Cooper,《C#设计模式》,电子工业出版社

<p style="FONT-SIZE: 10pt">[美]Alan Shalloway James R. Trott,《Design Patterns Explained》,中国电力出版社

<p style="FONT-SIZE: 10pt">[美]Robert C. Martin,《敏捷软件开发-原则、模式与实践》,清华大学出版社

<p style="FONT-SIZE: 10pt">[美]Don @R_406_2419@,Chris Sells,《.NET本质论 第1卷:公共语言运行库》,中国电力出版社

<p style="FONT-SIZE: 10pt"> 

= r.getWidth() 改为r.getHeight() > r.getWidth() 。这样就不会出现死循环了,而且我认为也应该是合理的,不知道是不是应该这样,还请吕兄赐教。        = r.getWidth() 改为r.getHeight() > r.getWidth() ”,那么在系统中加入正方形类后代码中所有长方形相关的代码都会受影响,这不正是失去了抽象的意义了吗?这样正好违反了LSP原则 !        中有详细说明,大家可以去看看。 再举一个鸭嘴兽的例子,假如浦乳动物的约束是:恒温,喂奶,那么鸭嘴兽可以是浦乳动物的子类,但要是再加一个约束:必须是胎生,那么鸭嘴兽就不可做浦乳动物的子类,目前动物学术界基本上认为鸭嘴兽属于浦乳动物。        = rectangle.getSide2() ) { rectangle.setSide2(rectangle.getSide2() + 1); } System.out.println(“rectangle:”); System.out.println(rectangle.getSide1()); System.out.println(rectangle.getSide2()); System.out.println(); } } 我传入的矩形是一个正方形,结果也没什么死循环啊。