设计格局:C#面向对象设计格局纵横谈[学习:01.面向对象的设计格局与规范 课程笔记]

 

 

 

GoF23 种设计格局是面向对象设计形式的功底、但不是设计形式的百分之百
• 历史性文章《设计形式:可复用面向对象软件的根基》1994
一书中讲述了23种经典面向对象设计方式,成立了形式在软件设计中的地位。该书四位小编被稠人广众并称呼Gang
of Four (GoF),“几人组”,该书讲述的23种经典设计格局又被人们称为GoF23
种设计情势。

由于《设计格局:可复用面向对象软件的根底》一书确定了设计形式的身份,人们寻常所说的设计格局隐含地表示“面向对象设计形式”。但那并不表示“设计方式”就非凡“面向对象设计方式”,也不代表GoF23种形式就代表了装有的“面向对象设计格局”。除了“面向对象设计情势”外,还有其他设计格局。除了GoF23
种设计格局外,还有越来越多的面向对象设计格局。
• GoF23
种设计情势是上学面向对象设计方式的起源,而非终点;本培训科目的对象是让学生在建立在有效格局的底子上,精通GoF23种设计形式。

重新认识面向对象

对于眼前的事例,从宏观层面来看,面向对象的构建方式更能适应软件的变动,能将转移所带动的影响减为最小

从微观层面来看,面向对象的法子更强调各类类的“义务”,新增员工类型不会潜移默化原本员工类型的兑现代码——那更合乎真实的世界,也更能说了算转变所影响的限制,毕竟Engineer类不应当为新增的“钟点工”来买单……
• 对象是怎么样?{不关切内部的环节}。
– 从概念层面讲,对象是某种拥有权利的空洞{}。
– 从标准层面讲,对象是一多级可以被其他对象使用的共用接口
– 从言语达成层面来看,对象封装了代码和数量{封装了行为和情景}。
• 有了这几个认识将来,怎么样才能设计“好的面向对象”?
– 听从一定的面向对象设计基准
– 熟习一些一级的面向对象设计格局

软件设计师对设计模式的定义的精晓:

近日需求变动了{}……
随着客户公司业务规模的进行,又冒出了越多类其他职工,比如钟点工、计件工……等等,那对人事管理系统提出了挑衅——原有的程序必须改变。
以身作则场景:(1)结构化做法
差一些所有关乎到员工类型的地方(当然包涵“总括薪给程序”)都亟待做改变……这几个代码都须求重新编译,重新布署…….
(2)面向对象做法
只必要在新的文本里增添新的员工类,让其持续自Employee抽象类,天公地道写GetSalary()方法,然后在EmployeeFactory.GetEmployee方法中依照相关标准,爆发新的员工类型就足以了。其余地点(展现薪给程序、Engineer类、Sales类等)则不须求做其余改动。

几条更实际的宏图标准
• 单一职分规范(SRP):
– 一个类应该仅有一个滋生它生成的案由。
• 开放封闭原则(OCP):
– 类模块应该是可扩充的,可是不得修改(对扩展开放,对改变封闭)
• Liskov 替换原则(LSP):
子类必须可以替换它们的基类
• 爱惜倒置原则(DIP):
– 高层模块不应当依靠于低层模块,二者都应该借助于肤浅。
– 抽象不该借助于贯彻细节,已毕细节应该依靠于肤浅。
接口隔离原则(ISP):
– 不应该强迫客户程序着重于它们并非的不二法门。

      
每一个方式描述了一个在大家周围不断重复发生的题材,以及该问题的解决方案的主旨。
                                                        ——Christopher
Alexander{建筑师}

 

 

(1)设计格局描述了软件设计进程中某一类常见问题的平常的化解方案。
(2)面向对象设计形式描述了面向对象设计进程中、特定情景下、类与彼此通讯的对象时期常见的社团关系。
(3)人是一个经验性的动物

讲座总括

设计情势描述了软件设计进度中某一类常见问题的日常的解决方案。面向对象设计方式描述了面向对象设计进程中、特定情景下、类与互为通讯的目的时期常见的社团关系。

深远掌握面向对象是学好设计方式的根底,通晓一定的面向对象设计原则才能把握面向对象设计形式的精髓,从而完结灵活运用设计格局。
• 三大主题面向对象设计规范
– 针对接口编程,而不是针对落实编程
– 优先接纳对象组合,而不是类继承
– 封装变化点
• 使用重构得到情势。敏捷软件开发实践提倡的“Refactoring to
Patterns”是当前普遍公认的最好的行使设计格局的措施。

 

以身作则场景:(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());

基本功:从编程语言直观了然面向对象
{至少在语言层了然面向对象,完成层通晓面向对象}

种种面向对象编程语言相互区分,但都能看到它们对面向对象三大机制的襄助,即:
“封装、继承、多态”
    – 封装,隐藏其间贯彻
    – 继承,复用现有代码
    – 多态,改写对象行为

使用面向对象编程语言(如C#),可以推动程序员以面向对象的研商来研商软件设计结构,从而加重面向对象的编程范式。

C#是一门帮助面向对象编程的卓越语言,包涵:各类级其他包裹协理;单达成持续+多接口完成;抽象方法与虚方法重写。

从一个演示谈起{什么样的安顿性才是面向设计目的设计}
咱俩须求统筹一个人事管理系统,其中的一个效应是对各样差别类其余职工,总计其当月的薪酬——差距档次的职工,拥有区其他薪饷计算制度
演示场景:(1)结构化做法(pasical\C)
1。获得人事系统中有着可能的职工类型
2。根据差其他员工类型所对应的不等的薪饷制度,总括其薪资
enumEmployeeType{Engineer;Sales;Manager;…}
// 统计薪酬程序
If ( type==EmployeeType.Engineer) {……}
else if (type== Employeetype.Sales) {……}

从筹划标准到设计格局
• 针对接口编程,而不是本着落到实处编程–
客户无需了然所运用对象的特定项目,只必要精通对象拥有客户所希望的接口。
• 优先利用对象组合,而不是类继承–
类继承常常为“白箱复用”,对象组合平时为“黑箱复用”。继承在某种程度上损坏了封装性,子类父类耦合度高;而目的组合则只要求被重组的对
象具有杰出定义的接口,耦合度低。
• 封装变化点

使用封装来成立对象之间的分界层,让设计者可以在分界层的两旁进行修改,而不会对另一侧暴发不良的熏陶,从而达成层次间的松耦合。

使用重构得到形式——设计方式的使用不当先入为主,一上来就动用设计形式是对设计形式的最大误用。没有一步到位的设计情势。很快软件开发实践提倡的“Refactoring
to Patterns
是当下常见公认的最好的应用设计情势的法门。{源代码就是统筹}

设计形式与面向对象

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

面向对象设计形式是“好的面向对象设计”,所谓“好的面向对象设计”是那一个可以满意“应对转移,升高复用”的安排。{“源代码就是统筹”,“好的格局是透过不停的重构”}

面向对象设计形式描述的是软件设计,因而它是独立于编程语言的,不过面向对象设计格局的末段促成仍然要利用面向对象编程语言来表述,本学科基于C#语言,但实际它适用于帮助.NET框架的所有.NET语言,如Visual
Basic.NET、C++/CLI等。

面向对象设计方式不像算法技巧,可以照搬照用,它是起家在对“面向对象”娴熟、长远的了然的根底上的经验性认识。驾驭面向对象设计格局的前提是首先了然“面向对象”!

设计情势简介:

但OOPL并非面向对象的方方面面
{应用面向对象的言语与使用面向对象设计情势是五个完全不一样的意况,明白面向对象语言不可以证实您驾驭面向设计格局}

通过面向对象编程语言(OOPL)认识到的面向对象,并不是面向对象的整整,甚至只是有始无终的面向对象。
• OOPL的三大机制“封装、继承、多态”
可以发挥面向对象的拥有概念,但那三大机制自我并不曾刻画出面向对象的主导精神。换言之,既可以用那三大机制做出“好的面向对象设计”,也能够用那三大机制做出“差的面向对象设计”。不是运用了面向对象的言语(例如C#),就完毕了面向对象的规划与付出!由此大家不可能借助编程语言的面向对象机制,来支配面向对象。

OOPL没有答应面向对象的根本性问题——我们怎么要运用面向对象?大家理应如何利用三大机制来落到实处“好的面向对象”?
大家应有遵守什么样的面向对象原则?

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

 

先是讲:1. 面向对象设计形式与标准