快速业务通道

冒号和他的学生们(连载22)——抽象思维 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16

“过滤缺点,抽取优点,西施就是这样炼成的。”冒号故意拉长了尾音。

众人不禁一乐。

冒号和他的学生们(连载22)——抽象思维(2)

时间:2011-07-03 BlogJava 郑晖

冒号继续讲解:“其次,抽象还有程度之别。抽象程度越高,细节越少,普适性越强。典型的例子如:从矩形到多边形、从多边形到一般形状。”

引号问道:“抽象对于软件设计有何现实意义?”

冒号回答:“软件设计者的任务是将复杂混沌的现实世界映射到精确严格的虚拟世界,要完成这种多对一的映射,抽象无疑是必由之路。在软件需求分析阶段,多通过属性导向式抽象(property-oriented abstraction)用逻辑语言来描述系统;在软件设计阶段,多通过模型导向式抽象(model-oriented abstraction)用模型语言来设计系统;在编码阶段,常用两种抽象机制:一种是参数抽象(abstraction by parameterization),一种是规范抽象(abstraction by specification)。”

句号望文生义:“参数抽象是不是指将函数代码中的一些特殊值作为参数来传递?”

“不错,这是最普通最常用的一种抽象方式。函数的每一个参数都是一种泛化,是对它所代表的所有可能值的一种抽象。我们看一个简单的例子。”冒号说完在黑板上写下一段代码——

int gcd(int a, int b) {    while (a != b)      (a > b) ? (a -= b) : (b -= a);    return a; }

冒号考问:“请问这个函数是干什么的?”

众人看了好一阵,有人犹豫地说,好像是求最大公约数吧?

冒号肯定道:“它确实是求最大公约数的,由两个正整数辗转相减而得。该函数通过参数抽象让a和b分别代表任意正整数,使之具有更强的普适性和重用性。问题是除了该代码的作者,其他人如何重用此函数?你不能假设用户知道gcd是Greatest Common Divisior的缩写,也不能假设他的数学程度,甚至不能确定他是否能看到源代码。短短两行代码的函数尚且如此,何况更加复杂的函数?”

引号答道:“那只能靠文档注释了。”

“非常正确!”冒号颔首,“这是注释文档最重要的作用。没有文档的API如同没有说明书的产品,用户是不敢轻易使用的。合格的文档注释中至少应包括先验条件(precondition)和后验条件(postcondition),分别指代码执行前后必须满足的条件。对于函数gcd而言,先验条件是:a、b均为正整数,后验条件是:返回输入二数的最大公约数。有了文档注释或规范说明(specification)的函数成为使用者与实现者之间的一种契约——使用者只能依赖规范,实现者必须满足规范。这种通过规范使代码的功能与实现相分离的方法便称为规范抽象。其好处是显而易见的:一方面,使用者不必阅读代码即可了解并使用它们;另一方面,实现者不必阅读或改写其他代码,只需在遵循规范的基础上修改本地代码,并且不用担心影响客户代码。比如我们可以用辗转相除法重新实现gcd。”

冒号随手又写了几行代码——

int gcd(int a, int b) {    return (b != 0) ? gcd(b, a % b) : a; }

逗号未见其妙:“这两种抽象机制在实际编程中经常用到,只是以前不知道它们的学名罢了。”

冒号正色道:“它们看起来虽然很基本,但平淡之中见真功。如果一个程序员能合理设计参数、严格遵循规范、有效制定规范,便已是难得之才了。”

众人扪心自问,离此要求确有相当距离。

冒号续道:“借助参数抽象和规范抽象,我们可以实现过程抽象(procedural abstraction)和数据抽象(data abstraction)。其中过程抽象容易理解,任何一个函数都是过程抽象的结果,它赋予程序员定义新运算或子程序

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号