- 热门文章:
- · 简单的理解类的继承和多态性
- · Interlude之深入浅出OOD(一)
- · 再说面向对象
- · OOP & OOD 及其模型
- · 面向对象的软件测试
- · 面向对象的分布式开发系统-理论篇(2)
- · 面向对象的分布式开发系统-理论篇(1)
- · 分布对象技术的新进展
- · 一个OO设计的命运
- · OO给我们带来了什么?
- · 了解AOP
- · 面向对象技术应用:并发面向对象技术
OO世界里的几个基本问题
在软件实践中,当专注于某个具体场景下的设计时,我们当中的不少人,很少有时间顾及或者愿意顾及自己思维中更深层次的东西。而当结束设计之后,如果我们因为累日的操劳,想急于放松一下的话,那么等回过头来,再试图做些总结的时候,却发现自己对那些具体实践环节的印象已经变得模糊不清了。而这些细节却很有可能是某个极有价值的思想的源泉。这就像是一个人匆匆忙忙走了一段路,然后停下来歇了一会儿,等他站起身来再回头看时,却已经忘了来时的路了。很遗憾,笔者也属于这样的人。本文试图在做一些对“往事”的回忆,并希望能够由此引发大家的思考。
我们看到了什么?
当我们站在高处眺望远处的楼群时,也许我们无法看清这些高大建筑的每个细节,门窗的制式、所用的型材……,可是我们却由此看清了它们的总体结构和趋势。在一个OO系统里,亦是如此,当我们忽略具体细节,以同样的目光审视这些OO世界里的建筑物时,我们看到了什么?我想,我们所看到的多半是一系列对象,以及介于这些对象之间的关系。
在清楚认识了呈现在我们面前的总体结构和趋势之后,后续问题便接踵而至。
我们在做些什么?
从上述观点出发,我们的设计过程便等同于:
勾画各个对象自身,明确其责任;
安排对象之间的关系,使其构成一个整体。
在这个问题上,尽管有诸多方法,但无一例外的是,所有方法都在做着这件相同的事情。
在明白了我们的行为所针对的对象和行为本身的含义之后,问题又产生了。
我们的目标是什么?
还有几个相关的问题:如何评价我们的行为(即评价标准问题)?我们所做的是好是坏?要做到什么程度?如果我们将目标作为评价标准,那么这些问题事实上可以归并为同一个。至于评价标准,在没有完成设计之前,我们大可以对此提出苛刻的、近乎完美的目标,而且,有很多这样的候选项可供选用。但是,正如Kent Beck所说的:
“Program have two kinds of value:what they can do for you today and what they can do for you tomorrow.”
诸多标准,最后可以分为两类:正确完整地实现既定功能;保证能够让后续开发顺利进行。当一个OO设计(也就是我们行为的结果),没有实现现有的需求,勿庸置疑,那自然是失败的,是一个不良设计。而在我们解决了“温饱问题”之后,我们就有机会可以将眼光放得更长远一些了,我们开始考虑如何使系统的结构更合理、更精巧;如何使之易于移植、易于复用;对于变化的需求,如何使之表现出更大的弹性;并开始考虑效率和成本的问题。理想状况下,我们的思考顺序是这样的,即我们首先考虑第一类评价标准,然后再考虑第二类,两者偶有交叉。但事实往往是,我们很容易会把这两者混在一起,而且越是优秀的programmer,就越可能犯这样的毛病(所以一个好的programmer,未必是一个好的designer)。
行为的对象、行为本身、行为的目标都有了,似乎所有关于认识的问题都明确了,这就剩最后一个,也是最具吸引力、最值得探索的问题了。
我们该如何去做?
如果把这些论述和哲学做个类比,那么前面所讲的大概属于本体论范畴,而这里所提的应该属于方法论范畴。有很多可以选用的方法,比较新的有:设计模式(Design Pattern),代码重构(Refactoring)。还有一些传统的面向对象设计方法,当然还有Quick and Dirty。对于不同的场景,目标的选取(既评价标准的选取)可能是有侧重的,这就有了选择不同方法的依据。某种方法并非在任何时候都是最适合的。它取决于你优先选用了诸多评价标准中的哪几个。有时,这些标准往往是彼此矛盾的,所以你不得不在它们中间不断的做折衷,寻求平衡点。最大的一对矛盾存在于上述两类评价标准之间,另一对在某些场合下很常见的矛盾,则是“结构和效率”(比如面向嵌入式系统的应用)。
小结
在认识了上述四个基本问题之后,我们看到了一个存在于OO世界里的框架,一个自封闭的、逻辑上完整的概念框架。每个问题(环节)彼此互不重复,又前后相继。在OO的世界里,每个“对象”(包括事物、概念、方法等等),都可以被归并到上述某个环节中,它们之间彼此又有着逻辑上的关联。每天,我们就是在这样的一个框架里做着我们该做的事情。
个人观点,仅供参考。
- · 信息系统建模方法
- · Abstract class VS Interface
- · 程序员需要一本面向对象的实践指南吗?
- · 在ASP.NET中面向对象的编程思想
- · 61条面向对象设计的经验原则
- · 面向对象分布式开发系统理论篇(上)
- · 面向对象分布式开发系统理论篇(下)
- · 围棋与OOAD
- · OO,OO以后,及其极限(1)
- · OO,OO以后,及其极限(5)
- · OO 设计过程:开始设计软件
- · OO 设计过程:验证分析
- · OO 设计过程:应用的用例,第 1 部分
- · OO 设计过程:应用的用例,第 2 部分
- · 编写用例文档-文档中应包括哪些部分,为什么要…
- · 用例建模技巧
- · UML用例建模的慨念和应用
- · UML的现状及未来发展
- · 建模的误区——走出一般性的设计误区,迈向成…
- · UML三大硬伤
- · 极限建模方法
- · 解析UML的动态建模机制(2)
- · 解析UML的动态建模机制(1)
- · UML元元模型与MOF及CDIF的一致
- · 解析UML的静态建模机制(3)
- · 解析UML的静态建模机制(2)
- · 解析UML的静态建模机制(1)
- · 於 UML 循序圖中應用造型和註解
- · Rational Rose和UML可视化建模基础
- · 标准建模语言UML的动态建模机制
- · 第二章 Hello World
- · 第一章 UML模型的基本概念
- · 用Uml画蓝图
- · 用UML画草图
- · UML一统天下 ——统一的不是建模过程而是建模…
- · 统一建模语言UML概述(二)
- · 敏捷开发者发现新西兰人干得更好
- · UML要点与应用
