你必须知道的.NET(第2版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第2章 OO大原则

2.1 OO原则综述

本节将介绍以下内容:

·面向对象基本原则讨论

·设计原则的历史

·学习的建议

2.1.1 引言

好的设计,成就好的作品;僵化的设计,则会使你的作品大打折扣。在软件领域更是如此,Bob大叔在其《敏捷软件开发——原则、模式与实践》一书的序言中就讲到“美的东西比丑的东西创建起来更廉价,也更快捷。”可见追求美好的软件设计不光是代码优雅的问题,更关乎生产成本。对于软件架构的研究经历了很长时间的摸索,从面向过程到面向对象,从设计原则到设计模式,对于如何设计更好软件的探索,从未停止。技术大师总结了很多设计上的经典法则,后来者可以站在巨人的肩膀上尽情享受丰富而珍贵的经验。[0]

在第1章“OO大智慧”中,我们分析和讨论了面向对象技术的基本要素,对继承、封装、多态和接口等进行了基本的讨论,如何将这些基本技术应用的得心应手,是本章要阐释的问题和目标。面向对象的原则也正是如何使用继承、封装、多态和接口技术进行优良设计的原则总结和规律认知,因此这两章的内容相辅相成,互为补充。

2.1.2 讲述之前

在将设计原则和盘推出之前,简单对设计进行一点思考和讨论,这样就能更加明确的了解设计原则的意义和目的。

首先,你的软件系统是否常常有下面的问题或困扰:

僵化。牵一发而动全身,你的系统不可修改或者扩展。

复杂和重复。过分复杂,难于理解,跟踪你的程序往往不知取向,没有设计不可取,过度设计同样不可取;或者系统中充满了重复的结构和实现。

不可复用。过于僵化而不可复用,不能剥离出独立的复用组件。

不够稳定。常常出错而又无法妥善解决问题,系统运行不够可靠。

正是这些问题的出现,促使人们开始不断思考对软件设计、软件架构和软件流程等内容的关注,设计原则也是在这种思考和探索中逐渐归纳总结而成的,通过灵活的应用设计原则,辅助一定的设计模式,封装变化、降低耦合,来实现软件的复用和扩展,这正是设计原则的最终意义。

首先是面向对象。随着面向对象编程思想的成熟,形成了以封装、继承和多态三大要素为主的完整体系,蕴涵了以抽象来封装变化,降低耦合,实现复用的精髓,而这三大因素相互联系、互相制约:封装用以隐藏具体实现,保护内部信息;继承实现复用;而多态改写对象行为,在继承基础上实现更高级别的抽象。在此基础上逐渐形成的一些基本的OO原则,例如封装变化、对接口编程、少继承多聚合,已经具有了面向对象设计原则的思想,而本节所述的原则可以看成是对这些思想的系统化引申和归纳。

然后是设计模式。模式代表了对经验的总结和提炼,是对重复发生的问题进行的总结和最佳解决策略的探索,自GoF的《设计模式:可复用面向对象软件的基础》这部巨著诞生以来,对于软件设计模式的探索成为每个设计开发者的必修课,而面向对象设计原则可以看做是了解设计模式的基础,为设计模式提供了基本的指导。经典的23个模式背后,都遵循着这些基本原则,而设计原则又由设计模式策略来实现,这就是二者之间的关系,所以了解原则对于认识模式具有绝对的指导意义。

最后,就是设计原则的故事。Robert C. Martin(Bob大叔)的巨著《敏捷软件开发——原则、模式与实践》对敏捷设计原则进行了深刻而生动的论述,不同的模式应对不同的需求,而设计原则则代表永恒的灵魂,需要在实践中时时刻刻地遵守,创造尽可能优雅、灵活的设计。

“你不必严格遵守这些原则,违背它们也不会被处以宗教刑罚。但你应当把这些原则看成警铃,若违背了其中的一条,那么警铃就会响起。”。

——ARTHUR J.RIEL,《OOD启思录》

请记住这些技术大师的名字和作品,并研习其中的经验和招式,正是他们让这个领域变得如此光彩夺目,沿着这些智慧的道路走下去,在品读经典的过程中,你会逐渐找到技术神灯之下的奥秘。

2.1.3 原则综述

本章将重点讲述最基本的5个设计原则,分别是:单一职责原则、开放封闭原则、依赖倒置原则、接口隔离原则和Liskov替换原则,在表2-1中列出了主要的一些面向对象设计原则及其简单描述,详细的分析将在本章各节逐步展开。

表2-1 设计原则

在本书中,我们只对前5大原则进行系统论述,关于合成/聚合复用原则,在1.2节“什么是继承”中已经有相关的论述。

2.1.4 学习建议

了解面向对象的设计原则,是个不断实践和研究的过程,对于僵化的代码和设计,应该在可能的情况下有重构的勇气。当然,学习和了解理论基础也是相当重要的方面:

深入了解设计基础。什么是设计基础呢?在我看来,面向对象的基本要素,面向对象的语言基础都是一切设计的基础,没有继承、多态、聚合的深入了解,就无法更好地认识设计原则中的实现理念。

打好设计原则的理论基础。本节简单总结了7种基本的设计原则,对于这些原则的核心思想和应用技巧应该建立基本的认识。

不断实践和反思。对于设计原则的实践,莫过于对僵化的设计操刀重构,要有不断完善的勇气和心力,在重构的实践中思考并形成经验。

了解设计模式。设计模式都是对于软件经验的经典总结,模式和原则相辅相成,深入了解常见的设计模式尤为重要,例如Proxy模式就是对单一职责原则的一种体现。

具备必要的修养。除了本章将要讨论的设计原则,还有一些通用的软件规则对于深入理解设计原则大有裨益,例如:高内聚、低耦合、控制器、受保护变化等,对于这些通用规则必须打好基础,在设计原则的很多方面都有这些基础规则的体现。

2.1.5 结论

请从了解设计原则开始,重构你的系统。将僵化而脆弱的设计踢出你的代码,应用面向对象的思想来理清需求,并从中分离抽象和具体,应用前人的经验来实现优雅的设计,构建灵活、可靠和健壮的软件。

本章将以适当的篇幅来关注软件设计原则,以及如何在.NET技术中实现,通过对5个基本设计原则的分析与应用,从中了解和体会如何使设计变得优雅,如何使软件更有扩展性和稳定性,如何避免僵化的设计架构。