面向对象设计的敏捷化方法
翻译:blueski [2005-4-10]
原文出处:javaworld
原文作者:Allen Horub
转载请注明:来自Sawin系统分析之窗
原文标题:如果你做了优秀的OO设计,一定要让它保持简单
原文出处: 以前我的一个学生曾经这么说:“我是不可能做面向对象设计的,因为我没有钱。”我很惊讶,就问他为什么会这样想,原来,他认为要做OO设计的话,必须先有Rational Rose,而这个软件很昂贵,当时每套要2500美元。在他的思想里,如果没有Rational Rose,设计是不可能完成的。遗憾的是,类似的荒唐想法已经广泛传播开了。已经有很多人认为,OO是一个需要高技术工具支撑的高技术方法,而与此同时,花了很高代价买来的工具实际上很可能被高高搁起,至少在很大程度上没有得到充分利用。
基于以上问题,在本文中我将对不同的OO设计工具进行考察,看一看这些工具是如何工作的,也看一看为什么我会认为它们没有用。然后,我还将介绍我的工作方式,并试图说明其有效性。至少,对我来说是很有效的。假如你能提出不同意见,也非常欢迎。
工具不会引导你工作
当今的所有设计工具都无法在以上过程中给你引导。在很大程度上可以说,这些工具所做的并不象它们的价格所暗示的那么好。Rational Rose就是一个典型,它甚至并不支持完整的UML全集。 正 当你完成了模型以后,你会点击一个“魔术”按钮,工具很快就生成了相关的代码。但是,这些代码并不是很好,究其原因有两个方面。第一,在很多工具里,虽然创建了类定义框架,但其中的方法太过简化,甚至是空的,而动态模型 则被忽略了;第二,没有一个工具能完全支持UML。UML是一种优秀的语言,能鼓励设计者进行即时创作,同时,大多数实际的设计内容是包含在文字说明里的,而设计工具将完全忽略这些说明。
结果,你开始在所生成的代码基础上进行堆砌工作,而这些代码看起来已经和原始设计毫不相干了,其实你已经抛弃了原来的设计。很多年的教训告诉我,没有设计的编程将 大大延长整个开发过程的时间,并且埋下了更多的Bug。
现在再来看看反相工程。打开你的工具,点击“魔术”按钮,导入代码,理论上讲,它会重新构造设计,使之和代码相吻合。这样的反相工程还是一些存在问题。虽然工具能生成新的类图,但是不会更新动态模型。由于动态模型才是设计的核心,所以你的设计会变得没有意义,除非你返回并手工更新模型,但实际上很少有人这么做。
正相工程使得编程人员完全忽略设计而只是一味地编程,然后,又通过反相工程从代码中生成设计图。在这样的做法下,编程人员不会再进行设计,他们所做的就只是堆砌代码,然后生成一大堆图形,但是,这并不是设计。
然而,设计实际上一个需要反复迭代的过程,随着开发和编程的进行,设计还需要作出相应的调整。在调整时,你应该先从设计的调整开始,然后再将代码对照设计来进行重构。为了做到这一点,你必须在工具里对整个软件进行完整的定义。而当你点击“魔术”按钮时,所生成的只是完成功能的程序,而整个过程成了反相工程的一次性工具。
http://www.javaworld.com/javaworld/jw-01-2002/jw-0111-ootools.html
http://www.javaworld.com/javaworld/jw-01-2002/jw-0111-ootools-p2.html
每一种成功的OO设计,大体上都遵循着这样的过程:
这些工具在代码自动生成方面,其实是毫无意义的。几乎所有的OO设计工具都遵循了正相工程的设想,当你开始在设计工具中用UML进行工作时,你创建了两种核心的 模型:静态模型和动态模型。静态模型表示了设计中的类,类之间的关系,以及类的属性和方法;动态模型则用一大堆图描述了软件运行时执行各种任务的系统对象。
CASE工具 假如不用这些工具,我还能怎么做呢? 至少,最快速的OO设计工具是白板!一个房间里,从墙壁到屋顶,最好有很多白板,以及容易订在墙上的活页纸、粘贴纸,等等。我曾经用这样的方式完成过很重要的项目,并且取得很大的成功。当我面对OO CASE工具时,我不得不在操作使用上颇费周折,而用白板工作时,一切都那么轻松自然。 在白板上工作的唯一困难是如何捕获白板上留下的信息。白板打印工具确实存在,但非常昂贵,很笨拙,而且太小。它可以跟踪笔在白板上的运行,捕获笔的按 下和释放,并传输到电脑里。其它的白板工具的工作原理和庞大的掌上记事本很相似。但是,这些工具还是有局限性,要知道,设计可能同时在几个办公室里进行,设计的思想可能会记录 在餐巾纸上,或者别的什么小纸片上,等等。你大概不可能把一个300磅的白板处理工具搬到餐厅里去吧。
CASE (Computer-Aided Software Engineering) 工具以Rational Rose为典型,将正相工程作为产品的核心。但是,正相工程并不是对任何事情都很有效,许多开发人员只是把Rose作为昂贵的制图工具。对于其它的类似工具,我个人认为至少有3种是值得考虑的,尽管我没有使用过其中的任何一种:
怎么做才有效?
那么,究竟怎么做才最为有效呢。如何把捕捉到的信息输送到电脑,再通过图片方式放到文档里,而不需要把它们转化为某种UML工具的图形文件呢?
我推荐的解决之道如下:
- 一个数码相机
- 一个有趣的软件产品,Pixid公司的Whiteboard Photo
电子图片的缺点是,经常不能和软件文档相互协调一致。为了弥补这一点,Whiteboard Photo对数码照片进行处理,使之更为适用。 但是,有时候一图胜千言。
下图是一个典型的白板的照片。
图1:典型的白板作图 |
图2:再看另一个图例。
图2:另一个白板图的照片 |
下图是whiteboard Photo对图1的改进
|
下图是whiteboard Photo工具对图2的改进
|
这是一个有趣的工具,用于将白板照片进行净化处理,我只需要敲一下键盘Ctrl-L。
软件就能自动找到并去除白板边缘,自动纠正拍照时的扭曲,以及因为拍摄角度 所带来的斜度,并能去除闪光灯产生的反光。该工具还能识别出笔的线条,识别出手写体并加以优化,于是,我可以在白板上勾画,然后制作出具备文档质量的图形 ,而不再把时间花在CASE工具上了。
保持
简单根据我的经验,当你做OO设计时,技术含量越低的工具效率越是好用。它们更快,更容易使用,在需要合作的环境里也能方便地提供交流。你可以看到,如果将白板 、数码相机,以及处理图片的工具(例如Whiteboard Photo),组合起来,就能为设计带来很实用的工作机制了。
资源
- 免费,开源的设计工具ArgoUML:http://argouml.tigris.org/
- Embarcadero's GDPro:http://www.embarcadero.com
- TogetherSoft: http://www.togethersoft.com
- Microsoft Visio: http://www.microsoft.com/office/visio/default.htm
- 本文所提到的Pixid Whiteboard Photo:http://www.pixid.com/home.html
- Allen Holub的个人网站:http://www.holub.com/goodies/goodies.html
[译后记]
本文的翻译带有翻译交流性质,所以在这里赘述几局。
本文采用意译,并为中文阅读习惯做了充分的调整,个人英文俗语和部分艰涩的短语已被省略,希望这无伤原文的优秀内涵。原文的目的之一是推荐一种为系统设计师制作的图形处理工具Whiteboard Photo,本人在翻译过程中,在语言引导方面做了修改,以更好地突出本文如标题所示的主要目的。
翻译时我确实也产生过一种冲动,想发明一种新的白板工具,它本身不是普通的白板,只当按下按钮时,才读取板上的信息,即手工图形和注解,然后自动生成图形文件。或者,多找些变通的办法。
本文的观点其实就是,越简单的设计效率越高,复杂的工具只能使效率降低。用白板笔勾画,自然比鼠标要好多了,我的思路非但不会被切断,而且会随着笔的勾画而发展。
多年以前,我也曾经常应用白板工具,在项目布置会上,在方案讨论会上,在模型设计时,等等。等做笔记的女孩交给我会议纪要时,我常发现,还不如把当时白板上画的照搬下来好呢。后来才知道,在白板上讨论,甚至建模,用数码相机拍摄,导入电脑,再打印出来,贴在四周墙上,实际上这是典型的Agile/XP方法。----本文虽然简短,但可谓是这种面向对象设计的敏捷方法的介绍,因此我特地修改了文章的标题,虽然大了些,但能达到“哗众取宠”的些许效果吧。
实际上白板工具也是有更多的不足的。例如,在大的项目里,你很难通过白板这样的简单工具来全程建模。编程时需要做的修改,同样是要手工更新设计。这时,你无法对电子图片进行方便的修改,而Rose这样的对象工具修改的效率显然更高些,等等。对于工具引导你的设计工作,要做到这一点,工具必然会非常复杂而死板,那么还不如不引导来得灵活。
最后,鉴于我十分冒昧地擅自翻译了Aleen Horub的文章,为表示感谢,并掩饰可能翻译有误的歉疚,这里先行为远方的Allen先生“免费”作一个广告:Allen Holub的OO Design: 汽车中的BMW!
(全文完)
【译者介绍】 blueski
Sawin网站站长,前小龙亭JSP实践之旅的站长。目前从事工程设计职业。具有低调、执着、朴实而勤奋的风格,保持着最后的理想主义。
译者Email地址:blueski.yu@gmail.com
文章来源于领测软件测试网 https://www.ltesting.net/