本文是我和近来认识的高级程序员tony的谈话内容整理而成Tony他对程序设计的认识足以使我无地自容Tony是个十分低调的人不为重用也没什么名气(我想他也不看重名气)设计好的程序是他最大的理想 《浅论设计》 nyra() & solotony ( ) 引言 软件的产生过程大概可分为计划实现和维护三个部分实现过程主要有四个工作分析设计编码测试本文主要讨论设计工作的方法 设计的前提 分析需要(需求分析)是设计的前提它为设计工作提供了目标和基础设计工作就是在分析产生 的目标和基础之前找到一条合理的路线假如目标和基础都是明确的那设计工作实际上就没有了任何 意义好比你要找一本书如果你知道是什么书(目标)又知道图书馆在哪里(基础)那么设计工作 就只变成了知识的组合(把有关于图书检索的知识组合起来)这时候设计工作就好比是中国的考试一样 无聊Tony说何不写个应试程序呢?自动化的CASE工具可以帮助我们完成这些设计 设计工作的挑战在于分析不可能得出一个清晰明确的目标甚至不能知道现在的基础是什么样的在 为别人设计程序时(一些大客户)他们的要求通常三天一变这种变化是计划所不能企及的也是对分析 的否定同时也对设计的挑战另外在很多情况下我们做为程序的实现人员都是无知的我们对手中 的工具一知半解对自己的水平过于自信这些都很可能导致在分析的时候得出不正确的结果不能知道现在 的基础是什么样的我们必须认同分析中这种不确定性不能指望分析的结论是完美无缺的 设计的理念 没有正确的设计理念 每一种设计方法或思想都试图证明它是正确的这种尝试就像在证明两条平行线永远不相交一样任何一种设计方法都是有效的但都有其局限性只在特定的情况下有效也不一定比其它的都好 关键是我们是否认同它并把它当成公理来使用 面向对象是我们的公理 Tony和我达成了这种认同这是我们谈话的基础也是核心内容而这种认同基于以下的理由 )OO(Object Oriented)更接近人的思维方式人思考问题时概念是最基本的单位这正是OO中对象所描述的 )OOD(Object Oriented Design)有非常好的支持很热门的东西总是有很多的支持者比如UMLC++等这使得OOD很容易容易做也容易实现(变成代码) )最后也是最不成理由的是我们喜欢常用它习惯也许是最关键的因素 面向对象的设计层次 汇编语言也可以用做实现OOD的编码工具但是它位于OO的最低层在为汇编语言所做的OOD中连最基本的对象概念都要明确说明OOD中由大到小可分为三个层次框架(framework)模式(pattern)和成语(idiom)它们从不同的抽象层次对设计的方法做出了说明 )框架框架是一种成熟的设计思路它着眼于设计的内容即设计的主体部分框架为设计指明方向典型的框架有win下的MFC OWL OpenClass等它们通常很大无所不包使用框架可以明确设计的主体结构虽然大多数框架都有实用性的类比如MFC中CArchive类但它们只能做为框架描述的工具而不能做为应用的直接内容它们可以做为应用的实现基础却不能直接使用 ) 模式模式是一系列类的组合方法它着眼于概念的组织即设计的枝节问题它可以把框架的描述类有效的组合起来产生类树(群)典型的模式在Gof的书中有详细的描述模式解决的是设计中如何走的问题它可能解决走哪一条叉路的问题也可能解决涉水还是搭桥的问题它不能解决向什么方向走的问题(这由框架决定)不能解决走路还是坐车的问题(这由成语解决)它是设计工作中比较常用的抽象层次通常讨论的设计问题都在这一层次上 )成语成语是语言相关的它指某一种程序设计语言中实现某些功能的习惯方案它可以大到如何实现类小到循环变量是i还是conter成语的掌握程序通常说明了设计师对语言的功力好的设计师不应在面对访问却不能属于(C++中的friendjava中的内嵌)这样有点复杂的问题就束手无策 设计的过程 设计没有结束也没有开始广义来说整个软件开发过程都弥漫着设计的成份计划或维护的任何想法都是设计的一部分或是影响设计的因素之一反复设计和持续设计是必要的也是不可避免的设计应保证自己的可扩展性设计的变化不应导致大量其它工作的无效简单的说就是应尽量设计可复用的代码减少专用代码的比例但这一条规则却不只针对代码 结语 成功的设计来自于实践却不局限于实践设计的思想(我们不说灵感因为灵感通常认为是神秘而不可琢磨的)来自于生活的 各个方面只有真的热爱并多方面的体验生活才有多样的思想 |