1.浅谈面向对象三大机制
面向对象编程的三大机制是封装、继承和多态。
封装隐藏内部实现,继承复用现有代码,多态改写对象行为。
继承以封装为基础,多态以继承为基础。封装侧重于单个对象的描述,继承和多态侧重于对象间的关系描述。
C#作为一种面向对象编程的语言,支持各种级别的封装实现,单实现继承和多接口实现;抽象方法与虚方法重写。
总结:通过编程语言OOPL认识到的面向对象是极为浅陋的面向对象。虽然面向对象的三大特征“封装、继承、多态”可以表达面向对象的所有概念,但是这三大机制并没有刻画出面向对象的核心精神。简而言之,并不是使用了面向对象的编程语言,就可以做出"好的面向对象设计"。因此我们不能依赖于编程语言的面向对象机,来掌握面向对象设计。一个优秀的程序员,不能仅仅依赖编程语言的面向对象。
OOPL并没有回答程序员为什么要使用面向对象编程语言?怎样使用三大机制,做出“好的面向对象”?以及应该遵循怎样的面向对象编程原则?
2.深入认识面向对象
隔离变化:
从宏观层面讲,面向对象的构建方式更适应软件的变化,能将变化带来的影响减为最小
各司其职
从微观层面讲,面向对象的方式更强调各个类的“责任”,新增员工并不会影响原来员工类型的实现--这
更符合真实的世界,也能控制变化影响的范围。
耦合关系直接决定着软件面对变化时的行为
紧耦合模块在面对软件变化时,相关的模块都要改变;
紧耦合是模块和系统之间关系太密切,存在着很多的相互调用。
松耦合模块在面对软件变化时,一些模块更容易被替换或更改,但是其他模块保持不变。
松耦合是模块或系统之间仅通过数据接口联系。
注意:大型系统要求系统之间松耦合,便于实现功能的任意组合和重用。
3.怎样利用三大机制实现“好的面向对象编程”
3.1对接口编程,而不是针对实现编程
(方法返回类型是接口,不是返回具体的类型)
客户程序无需知道所使用对象的特定类型,只要知道对象拥有所期望的接口。
3.2优秀使用对象组合,而不是类继承
类继承通常为“白箱复用(子类父类耦合度较高)”,对象组合为“黑箱复用(互相包含的关系)”,
继承在某种程度上破坏了封装性,子父类耦合度较高,而对象组合只要求被组合的对象具有良好
定义接口,耦合度低。
3.3封装变化
设计模式是“封装变化”的最佳阐释,无论是创建型模式、结构型模式还是行为型模式,归根结底还是寻
找软件中可能存在的“变化”,然后利用抽象模式对变化进行封装,由于抽象没有具体实现,就提供了一
种扩展的可能性。所以在软件设计过程中,需要标定变化、发现变化、寻找变化、封装变化。