C语言设计格局:C#面向对象设计形式纵横谈[学习:01.面向对象的设计情势与标准 课程笔记]

先是讲:1. 面向对象设计情势与原则

设计格局简介:

      
每一个情势描述了一个在大家周围不断重复暴发的题目,以及该问题的化解方案的骨干。
                                                        ——Christopher
Alexander{建筑师}

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

(1)设计格局描述了软件设计过程中某一类常见问题的司空眼惯的缓解方案。
(2)面向对象设计形式描述了面向对象设计过程中、特定情景下、类与互动通信的目的期间常见的协会关系。
(3)人是一个经验性的动物

 

GoF23 种设计情势是面向对象设计形式的底蕴、但不是设计格局的百分之百
• 历史性作品《设计模式:可复用面向对象软件的基本功》1994
一书中描述了23种经典面向对象设计格局,成立了格局在软件设计中的地位。该书四位作者被人们并号称Gang
of Four (GoF),“六个人组”,该书讲述的23种经典设计情势又被人们誉为GoF23
种设计形式。

由于《设计情势:可复用面向对象软件的基本功》一书确定了设计形式的地位,人们熟视无睹所说的设计情势隐含地表示“面向对象设计情势”。但这并不代表“设计情势”就相当“面向对象设计格局”,也不意味着GoF23种形式就表示了颇具的“面向对象设计情势”。除了“面向对象设计形式”外,还有另外设计情势。除了GoF23
种设计形式外,还有更多的面向对象设计形式。
• GoF23
种设计格局是学习面向对象设计形式的起源,而非终点;本培训科目的目的是让学生在创制在有效办法的功底上,精晓GoF23种设计形式。

 

设计形式与面向对象

面向对象设计格局解决的是“类与互动通信的目标期间的社团关系,包括它们的角色、职责、协作方法多少个方面。

面向对象设计格局是“好的面向对象设计”,所谓“好的面向对象设计”是这一个可以满足“应对转移,提升复用”的规划。{“源代码就是计划性”,“好的形式是由此不停的重构”}

面向对象设计形式描述的是软件设计,因而它是单身于编程语言的,不过面向对象设计格局的最终实现仍旧要使用面向对象编程语言来抒发,本课程基于C#言语,但其实它适用于帮助.NET框架的所有.NET语言,如Visual
Basic.NET、C++/CLI等。

面向对象设计模式不像算法技巧,可以照搬照用,它是确立在对“面向对象”熟知、浓厚的明白的底子上的经验性认识。了解面向对象设计情势的前提是第一领悟“面向对象”!

 

基础:从编程语言直观领会面向对象
{至少在语言层精通面向对象,实现层了然面向对象}

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

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

C#是一门襄助面向对象编程的优质语言,包括:各样级另外包装匡助;单实现连续+多接口实现;抽象方法与虚方法重写。

 

但OOPL并非面向对象的全套
{应用面向对象的言语与行使面向对象设计情势是六个完全不同的状态,精晓面向对象语言不可以证实您左右面向设计情势}

通过面向对象编程语言(OOPL)认识到的面向对象,并不是面向对象的成套,甚至只是浅尝辄止的面向对象。
• OOPL的三大机制“封装、继承、多态”
可以表明面向对象的具备概念,但这三大机制自我并从未刻画出面向对象的主干精神。换言之,既可以用这三大机制做出“好的面向对象设计”,也足以用那三大机制做出“差的面向对象设计”。不是采用了面向对象的语言(例如C#),就落实了面向对象的宏图与支出!因而大家不可以看重编程语言的面向对象机制,来支配面向对象。

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

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

 

从一个演示谈起{什么样的计划性才是面向设计目标设计}
咱们需要统筹一个人事管理系统,其中的一个效能是对各样不同类别的职工,总结其当月的工钱——不同门类的职工,拥有不同的薪金总括制度
以身作则场景:(1)结构化做法(pasical\C)
1。得到人事系统中存有可能的员工类型
2。按照不同的员工类型所对应的不比的薪饷制度,统计其工资
enumEmployeeType{Engineer;Sales;Manager;…}
// 总计工资程序
If ( type==EmployeeType.Engineer) {……}
else if (type== Employeetype.Sales) {……}

 

示范场景:(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());

明日要求变动了{}……
随着客户集团事情范围的进展,又出现了更多品类的职工,比如钟点工、计件工……等等,这对人事管理系统提议了挑战——原有的先后必须变更。
演示场景:(1)结构化做法
几乎拥有关乎到员工类型的地点(当然包括“统计工资程序”)都亟待做变更……这么些代码都亟需再行编译,重新部署…….
(2)面向对象做法
只需要在新的文件里增加新的员工类,让其继承自Employee抽象类,视同一律写GetSalary()方法,然后在EmployeeFactory.GetEmployee方法中遵照相关规范,爆发新的员工类型就足以了。其他地点(呈现工资程序、Engineer类、Sales类等)则不需要做任何变动。

 

重新认识面向对象

对于眼前的事例,从宏观层面来看,面向对象的构建模式更能适应软件的浮动,能将扭转所带来的震慑减为最小

从微观层面来看,面向对象的点子更强调各类类的“责任”,新增员工类型不会影响原本员工类型的兑现代码——这更契合真实的世界,也更能说了算转变所影响的限制,毕竟Engineer类不应有为新增的“钟点工”来买单……
• 对象是怎么?{不怜惜内部的环节}。
– 从概念层面讲,对象是某种拥有责任的架空{}。
– 从规范层面讲,对象是一多级可以被此外对象使用的国有接口
– 从言语实现规模来看,对象封装了代码和多少{封装了作为和气象}。
• 有了这些认识未来,如何才能设计“好的面向对象”?
– 遵从一定的面向对象设计规范
– 熟谙一些独立的面向对象设计形式

从规划规范到设计形式
• 针对接口编程,而不是对准落实编程–
客户无需理解所运用对象的特定类型,只需要精通对象具备客户所企望的接口。
• 优先选取对象组合,而不是类继承–
类继承平时为“白箱复用”,对象组合平常为“黑箱复用”。继承在某种程度上损坏了封装性,子类父类耦合度高;而目的组合则只要求被整合的对
象具有非凡定义的接口,耦合度低。
• 封装变化点

使用封装来创建对象之间的分界层,让设计者可以在分界层的边沿举办修改,而不会对另一侧暴发欠好的震慑,从而实现层次间的松耦合。

使用重构拿到形式——设计格局的选取不超越入为主,一上来就动用设计形式是对设计情势的最大误用。没有一步到位的设计格局。高效软件开发实践提倡的“Refactoring
to Patterns
是时下大规模公认的最好的运用设计格局的主意。{源代码就是计划性}

 

几条更具象的统筹规范
• 单一任务规范(SRP):
– 一个类应该仅有一个挑起它生成的原由。
• 开放封闭原则(OCP):
– 类模块应该是可增加的,不过不得修改(对扩展开放,对改变封闭)
• Liskov 替换原则(LSP):
子类必须可以替换它们的基类
• 倚重倒置原则(DIP):
– 高层模块不应当依靠于低层模块,二者都应该借助于肤浅。
– 抽象不应该借助于贯彻细节,实现细节应该依靠于肤浅。
接口隔离原则(ISP):
– 不应当强迫客户程序看重于它们并非的点子。

讲座总计

设计格局描述了软件设计过程中某一类常见问题的常常的化解方案。面向对象设计形式描述了面向对象设计过程中、特定情景下、类与互为通信的目的期间常见的协会关系。

深入通晓面向对象是学好设计形式的功底,精通一定的面向对象设计原则才能把握面向对象设计形式的精华,从而实现灵活运用设计格局。
• 三大基本面向对象设计标准
– 针对接口编程,而不是针对性落实编程
– 优先拔取对象组合,而不是类继承
– 封装变化点
• 使用重构得到格局。敏捷软件开发实践提倡的“Refactoring to
Patterns”是眼这周边公认的最好的采纳设计形式的形式。