19.3 原型设计
一般而言,如果想知道Python某个方面的工作原理,可尝试使用它。为此,你无需做大量的预处理工作(如对众多其他语言来说必不可少的编译或链接),而可直接运行代码。不仅如此,还可在交互式解释器中运行各个代码片段,对每个方面都进行探究,直到透彻理解代码的行为为止。
这种探索并不限于语言功能和内置函数。诚然,能够准确地了解iter等函数的工作原理很有用,但更重要的是能够轻松地创建程序原型,以便了解其工作原理。
注意 在这里, 原型( prototype)指的是尝试性实现,即一个模型。它实现了最终程序的主要功能,但在后期可能需要重写,也可能不用重写。通常,最初的原型都能变成可行的程序。
对程序的结构(如需要哪些类和函数)有一定的想法后,建议你实现一个功能可能极其有限的简单版本。当你有了可运行的程序后,将发现接下来的工作容易得多。你可添加新功能,修改不喜欢的方面,等等。这样你才能够真正明白程序的工作原理,而不仅仅是设想或画草图。
无论你使用的是哪种编程语言,都可进行原型设计,但Python的优点在于,使用它编写模型的投入很少,因此完全可以弃之不用。如果发现设计不够精巧,只需将原型丢弃,再重打锣鼓新开张。这个过程可能需要几小时或一两天,但如果你使用C++等语言编程,编写模型的工作量可能多得多,弃之不用将是个艰难的抉择。固守一个版本就会失去灵活性:你将受制于早期的决策,而根据你在实现过程中获得的经验,这些决策可能是错误的。
在本书后面的项目中,我将始终使用原型设计,不预先进行详细的分析和设计。每个项目都有两个实现。第一个实现是摸着石头过河:拼凑出一个能够解决问题(或部分问题)的程序,以便了解需要的组件以及对优秀解决方案的要求。在这个过程中,最重要的可能就是看到程序的各种缺陷。基于这些新的认识,再次尝试解决面临的问题,而此时我的判断力和洞察力可能更强。当然,你可以对代码进行修订,甚至开始第三次实现。通常,推倒重来所需的时间没有你想中那么长。只要你对程序的实际情况有详尽的认识,输入代码应该不需要太长的时间。
不要推倒重来
虽然这里提倡使用原型,但务必对推倒重来持谨慎态度,在你为编写原型投入了不少时间和精力时尤其如此。更好的选择可能是,对原型进行重构和修改,让其变成功能上更好的系统,其原因有多个。
一个可能出现的常见问题是“第二系统综合征”,即力图让第二个版本非常灵巧或完美无缺,导致永远没有完工的时候。
“不断重写综合征”在小说创作领域很常见,指的是不断地修改程序,甚至推倒重来。
在有些情况下,让程序“还行”可能是最佳的策略——管用就好。
还有“代码疲劳症”,即你对代码逐渐感到厌烦。你花了很长时间来编写代码,却发现
它丑陋而笨拙。导致代码看起来粗糙而笨拙的原因之一是,必须处理各种特殊情况并包含多种形式的错误处理等。无论如何,在新版本中也必须包含这些功能,而最初为了实现它们,你可能花了很大的精力(更别说为调试花费的精力了)。
换而言之,如果你觉得原型还有得救,能变成可行的系统,就应竭尽所能地修改它,而不是推倒重来。在本书后面关于开发项目的章节中,我将开发成果分成了界线清晰的两个版本:原型和最终的程序。这样做既是出于清晰考虑,也是为了突出通过编写软件的第一个版本获得的经验和洞察力。在实际开发工作中,完全可以先开发原型,再通过重构它来获得最终的系统。
要深入地了解推倒重来的恐怖之处,请参阅Joel Spolsky撰写的文章“Things You ShouldNever Do, Part I”( http://joelonsoftware.com)。据Spolsky讲,对所有软件公司来说,推倒重来都是最严重的策略性错误。
领取专属 10元无门槛券
私享最新 技术干货