软件设计的哲学:第十一章 两次设计

目录

设计软件是困难的,所以你对如何构建一个模块或系统的最初想法不太可能产生最好的设计。如果您为每个主要的设计决策考虑多个选项,您将得到一个更好的结果:设计两次

假设您正在为GUI文本编辑器设计管理文件文本的类。第一步是定义类将呈现给编辑器其余部分的接口;与其选择第一个出现在脑海中的想法,不如考虑几种可能性。一种选择是面向行的接口,它具有插入、修改和删除整行文本的操作。另一个选项是基于单个字符插入和删除的接口。第三种选择是面向字符串的接口,它可以跨行操作任意范围的字符。你不需要确定每种选择的每个特性;在这一点上,勾勒出几个最重要的方法就足够了。

尝试选择那些彼此截然不同的方法,这样你会学到更多。 即使您确定只有一种合理的方法,无论您认为第二种设计有多糟糕,都要考虑采用第二种设计。思考该设计的弱点并将其与其他设计的特点进行对比将是有益的。

在你草拟出可供选择的设计方案后,列出每种方案的优缺点。对于接口最重要的考虑是对于高级软件的易用性。在上面的例子中,面向行的接口和面向字符的接口都需要在使用text类的软件中进行额外的工作。在部分行和多行操作(如剪切和粘贴选择)期间,面向行的界面将需要更高级别的软件来分割和连接行。面向字符的接口将需要循环来实现修改多个字符的操作。这也值得考虑其他因素:

  • 一种替代方案的接口是否比另一种简单?在文本示例中,所有的文本接口都比较简单。
  • 一个接口比另一个接口更通用吗?
  • 一个接口是否能够比另一个接口更有效地实现?在文本示例中,面向字符的方法可能比其他方法慢得多,因为它需要对每个字符分别调用文本模块。

一旦你比较了不同的设计,你就能更好地确定最佳的设计。最好的选择可能是一个备选方案,或者您可能会发现可以将多个备选方案的功能组合到一个比任何原始选择更好的新设计中。

有时,没有一种选择特别有吸引力,当这种情况发生时,看看是否可以提出其他方案。使用您在最初的替代方案中确定的问题来驱动新的设计。如果您正在设计文本类,并且只考虑面向行的和面向字符的方法,那么您可能会注意到每种替代方法都很笨拙,因为它需要更高级别的软件来执行额外的文本操作。这是一个危险信号:如果有一个文本类,它应该处理所有的文本操作。为了消除额外的文本操作,文本界面需要更紧密地匹配发生在高级软件中的操作。这些操作并不总是对应于单个字符或单个行。这一行推理应该会为文本提供面向范围的API,从而消除了早期设计的问题。

两次设计原则可以应用于系统的许多层次。对于模块,您可以首先使用这种方法来选择接口,如上所述。然后您可以在设计实现时再次应用它:对于text类,您可以考虑诸如行链表、固定大小的字符块或“间隙缓冲区”之类的实现。“实现的目标和接口的目标是不同的:对于实现来说,最重要的是简单性和性能。在系统的更高层次上探索多种设计也很有用,比如何时为用户界面选择特性,或者何时将系统分解为主要模块。在每种情况下,如果您可以比较几个备选方案,就更容易确定最佳方法。

设计两次并不需要花费很多额外的时间。对于较小的模块(如类),您可能不需要超过一两个小时的时间来考虑替代方案。与您将花费几天或几周的时间来实现这个类相比,这只是一小部分时间。最初的设计实验很可能会产生一个更好的设计,这将比花两次时间来设计要好得多。对于较大的模块,您将在最初的设计探索中花费更多的时间,但是实现也会花费更长的时间,而且更好的设计的好处也会更大。

我注意到“两次设计”的原则有时很难被真正聪明的人所接受。当他们长大后,聪明的人发现他们对任何问题的第一个快速想法就足以获得一个好成绩;没有必要考虑第二种或第三种可能性。这很容易养成不好的工作习惯。然而,随着这些人年龄的增长,他们会被提升到越来越困难的环境中。最终,每个人都会到达一个临界点,你的第一个想法不再足够好;如果你想获得真正好的结果,你必须考虑第二种可能,或者第三种,不管你有多聪明。大型软件系统的设计就属于这一类:没有人有足够的能力在第一次尝试时就把它做好。

不幸的是,我经常看到聪明的人坚持执行他们脑海中出现的第一个想法,这导致他们没有发挥出他们真正的潜力(这也让他们在工作中感到沮丧)。也许他们潜意识里认为“聪明人第一次就能成功”,所以如果他们尝试多种设计,那就意味着他们根本不聪明。事实并非如此。这并不是说你不聪明,问题是真的很难。此外,这是一件好事:解决一个需要仔细思考的难题要比解决一个根本不需要思考的简单问题有趣得多。

两次设计的方法不仅提高了你的设计,也提高了你的设计能力。设计和比较多种方法的过程将教会您使设计更好或更差的因素。 随着时间的推移,这将使你更容易排除糟糕的设计,并专注于真正伟大的设计。

(0)

相关推荐

  • 【学术论文】基于3 GS/s 12 bit ADCs的 高速串行接口控制层电路的设计与实现

     高性能数据转换器是第五代移动通信基站系统的核心器件,其采样速率不低于3 GS/s.分辨率高于12 bit,因此高速串行接口取代传统接口电路成为必然趋势.基于JESD204B协议设计了一种应用于3 G ...

  • 设计模式(Design Patterns)的简单讲解

    模式的诞生与定义 模式(Pattern)起源于建筑业而非软件业(小本本记下来--) 模式之父--美国加利佛尼亚大学环境结构中心研究所所长Christopher Alexander博士; 模式 : -C ...

  • 判断软件设计好坏的三个标准

    我们都知道,软件的质量是设计出来的.好的设计意味着好的质量.那么,如何判断软件设计的好坏呢? 可以基于以下3个标准来判断软件设计好坏: 设计必须覆盖所有需求,所有需求都必须被设计 设计是实现的基础,如 ...

  • 《软件设计的哲学》解读

    引言 本书的英文名称为<A Philosophy of Software Design>,由斯坦福大学教授.Tcl 语言发明者 John Ousterhout所著,在bookstack上有 ...

  • 《江花》连载:第二十一章 两个女人的战争(下)

    到了家门口,江花与大妮二妮三个人一起,从车上往下卸柴.柴湿,柴重.三个女人费了好大的劲儿,一捆儿也没有扒下来.陈皮放下车把,走过来.他攥住了江花手中的纤担.他喊了一声,一二三--,两个人一起用力.啪, ...

  • 《广州棋坛六十年》第八十一章 陈镜堂勇夺两广积分赛冠军

    第八十一章 陈镜堂夺获两广积分赛冠军 一九三六年初,谢侠逊在广州大战群雄的峰烟刚熄,两广积分赛又先掀起了棋坛好汉的大厮杀. 这场比赛从四月十日开始,到七月十五日结束,历时三个多月. 参加比赛的棋手有黄 ...

  • 第两百四十一章 想道歉又被李素挂电话

    第两百四十一章  想道歉又被李素挂电话 自己找一个干净的位置躺下,双手和在一起,抱着后脑勺,用嘴唇夹着烟,眼望星空.我根本没什么心情去欣赏这么美妙的景色.因为我在想要不要给李素打个电话,很想知道她现在 ...

  • 『中医偏方精品』第十一章 外科杂症

    一.疯犬咬伤 疯犬咬伤即狗咬伤,其毒素侵入人体,一般潜伏期短者8-10天,长者可达8个月至1年以上,伤口愈深,愈近头部潜伏期愈短,发病最初表现乏力.头痛.呕吐.食欲差,喉部有深缩感;1-2天后出狂躁. ...

  • 『中医偏方精品』第二十一章 鼻科疾病

    第二十一章  鼻科疾病 一.鼻炎.副鼻窦炎 急性鼻炎即俗名之"伤风",为一常见鼻病,多发于秋.冬.春季气候变换之际.这里不作重点介绍.下面着重介绍慢性单纯性鼻炎. 所谓慢性单纯性鼻 ...

  • 宝利老师导读《苏东坡传》第十一章

    第十一章 本章讲了苏轼在杭州的美好生活.三个层次. 一.美景的故事. 二.和尚的故事. 三.妓女的故事. 四.初恋的故事. 苏轼充分参与了西湖的美好生活.而且一有机会就游山玩水.我们最熟悉的是他的&q ...

  • 宝利老师导读《苏东坡传》第二十一章

    第二十一章 本章的主题词是"全身而退".可以分为三个层次: 一.被弹劾的本质. 二.报答太后. 三.请求辞官 苏轼不追求政治,却被政治追逐.王安石当权,因为政见不同而被排斥正常,自 ...

  • 宝利老师原创童话试读:《小白龙的山坡》第十一章

    号 外 宝利老师的原创三本童话书 就要出版啦!!! 名家推荐语: 宝利是一名中学语文教师,他清楚语文应该给孩子什么:她也是一个小学五年级男孩的妈妈,她知道自己的孩子需要什么.这三本童话--<小白 ...