面向对象设计方式纵横谈,笔记记录

率先讲:1. 面向对象设计情势与规范

      
李建忠先生讲的《面向对象设计方式纵横谈》,早就看过了,现在有了时光重新整理一下,在此以前的博客【Sadie网】没有了,以往搬到新浪,重新过一遍,也有利于未来浏览。

设计格局简介:

     
在开始具体的讲设计格局在此以前,先来一篇准备的的小说,也是背后设计方式的来自的篇章,没有这么些规范,前边的设计情势也是枉谈。这几个条件是上学设计方式的基础,只有很好的知道了这一个陈设标准,对前边的情势的读书才会两全其美。同时有个别概念性的东西也在此校对一下。

      
每三个情势描述了2个在大家周围不断重复发生的难点,以及该难题的缓解方案的基本。
                                                        ——Christopher
Alexander{建筑师}

    
好了,正式开班,按着录像的相继整理下来。**

软件设计师对设计情势的概念的了然:

设计形式简介**

(1)设计格局描述了软件设计进程中某一类常见难点的常见的消除方案。
(2)面向对象设计情势描述了面向对象设计进程中、特定情景下、类与相互通讯的对象以内常见的社团关系。
(3)人是一个经验性的动物

葡京在线官网 1初期形式的概念来源于建筑,把情势的眷恋解释清楚,所以从早先导讲起。

 

(1)每一个模式讲述了2个在我们周围不断重复暴发的难点,以及该难点的化解方案的基本

GoF23 种设计形式是面向对象设计格局的底子、但不是设计格局的全套
• 历史性小说《设计形式:可复用面向对象软件的根底》一九九三一书中讲述了23种经典面向对象设计方式,创制了情势在软件设计中的地位。该书四个人小编被大千世界并称呼Gang
of Four (GoF),“两人组”,该书讲述的23种经典设计格局又被人们称为GoF23
种设计格局。

由于《设计形式:可复用面向对象软件的功底》一书分明了设计形式的地位,人们一般所说的设计形式隐含地表示“面向对象设计情势”。但那并不表示“设计格局”就约等于“面向对象设计格局”,也不代表GoF23种方式就意味着了富有的“面向对象设计方式”。除了“面向对象设计形式”外,还有其余设计情势。除了GoF23
种设计情势外,还有更多的面向对象设计形式。
• GoF23
种设计方式是学习面向对象设计形式的起源,而非终点;本培训科目标目的是让学员在确立在有效方式的底蕴上,领会GoF23种设计形式。

——Christopher Alexander

 

 

设计方式与面向对象

面向对象设计形式化解的是“类与相互通讯的靶子之间的社团关系,包含它们的角色、任务、合作方法多少个地点。

面向对象设计形式是“好的面向对象设计”,所谓“好的面向对象设计”是那2个可以满意“应对转移,升高复用”的设计。{“源代码就是规划”,“好的方式是透过不停的重构”}

面向对象设计情势描述的是软件设计,因而它是独立于编程语言的,但是面向对象设计情势的末段促成依然要利用面向对象编程语言来发挥,本学科基于C#语言,但实际它适用于支持.NET框架的全部.NET语言,如Visual
Basic.NET、C++/CLI等。

面向对象设计方式不像算法技巧,可以照搬照用,它是起家在对“面向对象”熟谙、深刻的领会的基础上的经验性认识。通晓面向对象设计形式的前提是首先明白“面向对象”!

 

 

(2)设计形式讲述了软件设计进程中某一类常见难题的见惯不惊的缓解方案。

基本功:从编程语言直观精晓面向对象
{至少在语言层精通面向对象,完结层驾驭面向对象}

各样面向对象编程语言彼此区分,但都能观察它们对面向对象三大机制的支撑,即:
“封装、继承、多态”
    – 封装,隐藏其中贯彻
    – 继承,复用现有代码
    – 多态,改写对象行为

使用面向对象编程语言(如C#),可以促进程序员以面向对象的沉思来讨论软件设计结构,从而加重面向对象的编程范式。

C#是一门支持面向对象编程的出色语言,包涵:各样级其他卷入辅助;单落成持续+多接口已毕;抽象方法与虚方法重写。

(3)面向对象设计方式讲述了面向对象设计进程中、特定情景下、类与互动通讯的对象中间常见的协会关系。

 

 

但OOPL并非面向对象的方方面面
{应用面向对象的言语与使用面向对象设计格局是八个完全不相同的情景,通晓面向对象语言不能证实您了然面向设计格局}

通过面向对象编程语言(OOPL)认识到的面向对象,并不是面向对象的整整,甚至只是半涂而废的面向对象。
• OOPL的三大机制“封装、继承、多态”
可以表明面向对象的拥有概念,但那三大机制自作者并不曾刻画出面向对象的着力精神。换言之,既可以用那三大机制做出“好的面向对象设计”,也可以用那三大机制做出“差的面向对象设计”。不是拔取了面向对象的言语(例如C#),就兑现了面向对象的筹划与付出!因而咱们不恐怕借助编程语言的面向对象机制,来精通面向对象。

OOPL没有答应面向对象的根天性难点——大家为啥要运用面向对象?大家相应什么使用三大机制来促成“好的面向对象”?
大家应有听从什么的面向对象原则?

任何1个尊严的面向对象程序员(例如C#程序员),都须求系统地学习面向对象的知识,单纯从编程语言上得到的面向对象知识,不可知独当一面面向对象设计与开发。

人是三个经验性的动物,相当于说人是会总括的

 

 

从二个演示谈起{什么样的规划才是面向设计目的设计}
小编们必要规划1人事管理系统,其中的多少个意义是对各样不相同类其他职工,总结其当月的薪资——今非昔比品类的员工,拥有不一样的薪俸统计制度
演示场景:(1)结构化做法(pasical\C)
1。得到人事系统中有所或者的职工类型
2。依据区其余员工类型所对应的例外的报酬制度,总计其薪酬
enumEmployeeType{Engineer;Sales;Manager;…}
// 总计薪水程序
If ( type==EmployeeType.Engineer) {……}
else if (type== Employeetype.Sales) {……}

GoF23种设计情势

 

历史性作品《设计方式:可复用面向对象软件的底蕴》一书中讲述了23种经典面向对象设计格局,成立了形式在软件设计中的地位。该书2个人我被大千世界并成为Gang
of
Four(GoF),“两人组”,该书讲述的23种经典设计方式又被大千世界称为GoF23种设计方式。

演示场景:(2)面向对象设计
1。依据分裂的职工类型设计分歧的类,并使这几个类继承自三个Employee抽象类,其中有七个浮泛方法GetSalary。
2。在挨家挨户不一样的员工类中,根据本身的薪饷制度,重写(override)GetSalary方法。
abstract class Employee{

public abstract intGetSalary();
}
class Engineer: Employee{

public override intGetSalary() {
……
}
}
class Sales: Employee{

public override intGetSalary() {
……
}
}
// 突显薪金程序
Employee e=emFactory.GetEmployee(id);
MessageBox.Show( e.GetSalary());

出于《设计形式:可复用面向对象软件的基础》一书明确了设计方式的身份,人们寻常所说的设计形式隐含地表示“面向对象设计格局”。但那并不意味“设计方式”就特出“面向对象设计形式”。除了“面向对象设计情势”外,还有别的设计情势。除了GoF23中设计方式外,还有愈多的面向对象设计形式。

当今须求变动了{}……
乘机客户公司业务范围的开展,又并发了更四类其余员工,比如钟点工、计件工……等等,那对人事管理系统提议了挑衅——原有的程序必须变更。
演示场景:(1)结构化做法
少了一些拥有涉嫌到职工类型的地方(当然包含“总结报酬程序”)都亟待做变更……这么些代码都须求重新编译,重新陈设…….
(2)面向对象做法
只须要在新的文本里扩充新的员工类,让其后续自Employee抽象类,相提并论写GetSalary()方法,然后在EmployeeFactory.GetEmployee方法中依照有关规则,暴发新的员工类型就足以了。其他地点(呈现薪水程序、Engineer类、Sales类等)则不需求做其余改动。

GoF23种设计方式是读书面向对象设计形式的起源,而非终点;本学科的靶子是让大家在确立在有效办法的底子上,了解GoF23种设计形式。

 

 

重新认识面向对象

对于目前的例证,从宏观层面来看,面向对象的打造方式更能适应软件的扭转,能将扭转所牵动的震慑减为最小

从微观层面来看,面向对象的法门更强调各样类的“权利”,新增员工类型不会潜移默化原本员工类型的落到实处代码——那更合乎真实的世界,也更能控制转变所影响的限制,终归Engineer类不应有为新增的“钟点工”来买单……
• 对象是什么样?{不尊崇内部的环节}。
– 从概念层面讲,对象是某种拥有权利的空洞{}。
– 从原则层面讲,对象是一多级可以被其他对象使用的公共接口
– 从言语已毕层面来看,对象封装了代码和数量{封装了作为和气象}。
• 有了这个认识将来,怎么着才能设计“好的面向对象”?
– 遵从一定的面向对象设计基准
– 熟习一些一级的面向对象设计形式

设计形式与面向对象

从筹划标准到设计情势
• 针对接口编程,而不是针对性落到实处编程–
客户无需通晓所采纳对象的一定项目,只需求精晓对象拥有客户所期望的接口。
• 优先利用对象组合,而不是类继承–
类继承日常为“白箱复用”,对象组合平日为“黑箱复用”。继承在某种程度上破坏了封装性,子类父类耦合度高;而目的组合则只需要被整合的对
象具有特出定义的接口,耦合度低。
• 封装变化点

使用封装来创制对象之间的分界层,让设计者可以在分界层的一侧举行改动,而不会对另一侧发生不佳的影响,从而落成层次间的松耦合。

使用重构拿到格局——设计情势的采纳不宜先入为主,一上来就应用设计情势是对设计情势的最大误用。没有一步到位的设计方式。飞快软件开发实践提倡的“Refactoring
to Patterns
是当下常见公认的最好的使用设计情势的主意。{源代码就是安插性}

面向对象设计情势消除的是“类与互动通讯的目标之间的社团关系”,包罗它们的角色、职分、同盟方法几个方面。

 

面向对象设计格局是“好的面向对象设计”,所谓“好的面向对象设计”是那么些能够满足“应对转移,进步复用”的设计。

几条更具象的安顿基准
• 单一职分规范(S奥迪Q5P):
– 三个类应该仅有贰个滋生它生成的原委。
• 开放封闭原则(OCP):
– 类模块应该是可增添的,不过不可修改(对增加开放,对转移封闭)
• Liskov 替换原则(LSP):
子类必须可以替换它们的基类
• 看重倒置原则(DIP):
– 高层模块不应该借助于低层模块,二者都应有借助于肤浅。
– 抽象不应有依靠于达成细节,已毕细节应该借助于肤浅。
接口隔离原则(ISP):
– 不应当强迫客户程序倚重于它们并非的格局。

面向对象设计情势描述的是软件设计,因而它是独自于编程语言的,不过面向对象设计方式的末梢兑现依旧要拔取面向对象编程语言来表述,本学科基于C#语言,但实质上它适用于帮助.NET框架的全数.NET语言,如Visual
Basic.NET、C++/CLI等。

讲座计算

设计格局描述了软件设计过程中某一类常见难点的日常的化解方案。面向对象设计格局描述了面向对象设计进程中、特定情景下、类与互相通信的靶子之间常见的社团关系。

深远领会面向对象是学好设计方式的根底,领会一定的面向对象设计标准才能把握面向对象设计情势的精髓,从而完结灵活运用设计情势。
• 三大骨干面向对象设计条件
– 针对接口编程,而不是针对落实编程
– 优先采用对象组合,而不是类继承
– 封装变化点
• 使用重构获得方式。敏捷软件开发实践提倡的“Refactoring to
Patterns”是当前普遍公认的最好的使用设计格局的法子。

面向对象设计方式不像算法技巧,可以照搬照用,它是起家在对“面向对象”熟习、长远的精通的根基上的经验性知识。领会师向对象设计形式的前提是率先精通“面向对象”!

 

从编程语言直观驾驭面向对象

种种面向对象编程语言相互区分,但都能观察它们对面向对象三大机制的支撑,即:“封装、继承、多态”

-封装,隐藏其中贯彻

-继承,复用现有代码

-多态,改写对象行为

运用面向对象编程语言(如C#),可以有助于程序员以面向对象的想想来想想软件设计结构,从而加剧面向对象的编程范式。C#是一门援助面向对象编程的理想语言,包蕴:种种级其他卷入援助;单完成接二连三+多接口达成;抽象方法与虚方法重写。

 

但OOPL并非面向对象的全套

通过面向对象编程语言(OOPL)认识到的面向对象,并不是面向对象的全部,甚至只是半涂而废的面向对象。

OOPL的三大机制“封装、继承、多态”可以公布面向对象的有所概念,但那三大机制自作者并没有刻画出面向对象的主旨精神。换言之,既能够用那三大机制做出“好的面向对象设计”,也足以用那三大机制做出“差的面向对象设计”。不是利用了面向对象的言语(例如C#),就兑现了面向对象的布署与付出!因而大家无法借助编程语言的面向对象机制,来支配面向对象。

OOPL没有答复面向对象的根天性难题——大家怎么要选取面向对象?大家相应什么利用三大机制来促成“好的面向对象”?大家应该依据哪些的面向对象原则?

其余一个简直的面向对象程序员(例如C#程序员),都亟待系统地学习面向对象的文化,单纯从编程语言上得到的面向对象知识,不可见独当一面面向对象设计与付出。

 

从3个报酬示例谈起

葡京在线官网 2

葡京在线官网 3

 

葡京在线官网 4

 

重新认识面向对象

对此眼前的例子,从宏观层面来看,面向对象的营造格局更能适应软件的转变,能将转变所带来的熏陶减为最小。

从微观层面来看,面向对象的艺术更强调各种类的“权利”,新增员工类型不会影响原本员工类型的贯彻代码——这更适合实际的社会风气,也更能决定转变所影响的范围,终究Engineer类不应有为新增的“钟点工”来买单……

目标是怎么样?

-从概念层面讲,对象是某种拥有权利的架空。

-从标准层面讲,对象是一文山会海可以被其余对象使用的共用接口。

-从言语已毕层面来看,对象封装了代码和多少。

有了那几个认识以往,怎么样才能设计“好的面向对象”?

-坚守一定的面向对象设计条件

-熟知一些鳌头独占的面向对象设计方式

 

从规划基准到设计情势

针对接口编程,而不是指向落到实处编程

-客户无需清楚所拔取对象的一定项目,只需求驾驭对象拥有客户所梦想的接口

先期拔取对象组合,而不是类继承

-类继承经常为“白箱复用”,对象组合常常为“黑箱复用”。继承在某种丹佛上损坏了封装性,子类父类耦合度高;而目的组合则只须要被重组的目的拥有能够定义的接口,耦合度低。

打包变化点,隔离变化点

-使用封装来创制对象之间的分界层,让设计者可以在分界层的一旁举办修改,而不会对另一侧发生不良的熏陶,从而完结层次间的松耦合。

使用重构拿到情势——设计格局的应用不宜先入为主,一上来就应用设计情势是对设计方式的最大误用。没有一步到位的设计情势。敏捷软件开发实践提倡的“Refactoring
to 帕特terns”是眼上周边公认的最好的施用设计情势的章程。

 

据悉以上三条原则而得到5条更具体的规划规范

单纯性任务规范(S奥迪Q3P)

-1个类应该仅有一个挑起它生成的因由。

绽黄石闭原则(OCP)

-类模块应该是可扩展的,然则不可修改(对增加开放,对转移封闭)

Liskov替换原则(LSP)

-子类必须可以替换它们的基类

借助倒置原则(DIP)

-高层模块不应当依靠于低层模块,二者都应当借助于肤浅。

-抽象不应当依靠于完成细节,达成细节应该借助于肤浅。

接口隔离原则(ISP)

-不应有强迫客户程序重视于它们并非的艺术。

 

总结

葡京在线官网,设计形式描述了软件设计进度中某一类常见难题的常备的缓解方案。面向对象设计情势描述了面向对象设计进程中、特定情景下、类与互相通讯的目的时期常见的协会关系。

深入通晓面向对象是学好设计方式的根基,驾驭一定的面向对象设计条件才能把握面向对象设计情势的精华,从而完结灵活运用设计格局。

三大主导面向对象设计规范

-针对接口编程,而不是指向落到实处编程

-优先利用对象组合,而不是类继承

-封装变化点

选择重构得到方式。敏捷软件开发实践提倡的“Refactoring
to 帕特terns”是眼下广大公认的最好的应用设计方式的法子。

相关文章