冒号和他的学生们(连载25)——软件应变 - 编程入门网
冒号和他的学生们(连载25)——软件应变时间:2011-07-03 BlogJava 郑晖25.软件应变 潜其心能观天下之理,定其心能应天下之变 ——《吕坤·呻吟语》 第七课刚一开堂,冒号就提了一个问题:“如果把一个Java程序中所有的private关键字换成public,请问该程序还能工作吗?” “应该还能工作,除非——此前不能工作。”问号小心翼翼地回答。 冒号接着问:“既然如此,何必费事区分它们呢?” 叹号嘴一撇:“当然是为了信息隐藏啰。” 冒号步步紧逼:“隐藏什么信息呢?又为什么要隐藏?” 叹号应对:“对象的状态需要隐藏。如果一个对象的状态直接暴露在外,让客户随意修改,可能会破坏对象的内在逻辑。” 冒号依旧穷追不舍:“那为什么对象的方法有些也需要隐藏?” “以前我也有此疑问,看别人代码时最感兴趣的就是那些私有方法。”引号不打自招。 逗号逗他:“看来你患有偷窥癖哦。” 引号暗暗踢了逗号一脚:“现在我明白了,这是为了实现数据抽象,将接口与实现分离开来。” 冒号仍不罢休:“这种抽象究竟有何实际好处?” 句号抢答:“一方面,抽象接口描述了一个类最本质的行为特征;另一方面,具体实现随时可能变动,隐藏它们可以保证这种变动不会波及客户代码。” “说到点子上了!”冒号终于停止了追问,“软件与硬件之别,不仅是无形与有形之别,更是变化与固化之别。所谓变化,指源代码随时可能因需而变。一个软件修改维护的时间通常会超过编写时间,越复杂越成熟的程序越是如此。软件的难点有二:其一是逻辑的复杂,其二是需求的变化。许多程序员看重前者而看轻后者,大部分时间花在寻求解决方案上,而不是在选择解决方案上。他们目眩于奇技淫巧却不解大巧若拙之妙,殊不知充满技巧的代码不仅难于理解而易于出错,且因其普适性低而受变化的冲击更大。众所周知,比武时最忌招式用老,老即难以变化,一旦为对手看破则后果不堪设想。同样,动不动凌空跃起只是影视作品中招徕眼球的花哨场面,实战中很少出现,盖因空中不易变招。当然凡事皆有度,无一招用老,便无一招用实,难以完成致命一击。反映在软件上,那就是过度设计会带来不必要的复杂和效率损失。” 众人均想,又上起久违的武术课了。 冒号滔滔不绝:“一言以蔽之,软件之软,体现在适应变化的能力。许多编程设计思想包括OOP的思想都是以此为主题的,抽象与封装便是典型代表。抽象一个对象模型即是将一类对象最本质因而最不易变化的部分提炼出来,而封装——准确地说是信息隐藏——则是将非本质、容易变化的部分隐藏起来,从而将一个类划分为阴阳两面。由于变化多发生在阴面,对外是屏蔽的,因此修改该面毫无累及客户之忧,由此提高了软件的抗变能力。有些人误认为信息隐藏是出于软件安全(security)的考虑,实乃是似是而非的皮相之见。” 问号提问:“软件的变化主要有哪些?” “软件的变化大致分两种:一种是出于内在需求而作的结构性变化,通常以改善软件质量为目的,即所谓的重构(refactoring);一种是出于外在需求而作的功能性变化,通常以满足客户需要为目的。理想的抽象与封装,应能完全避免第一类变化对于客户代码的影响,也能最大限度地降低第二类变化的副作用。只是知易行难,为细微的变化而付出巨大代价的例子比比皆是。‘千年虫’就是一个最典型的例子,而当32 位的IPv4 全部换成128位的IPv6 ,其代价也不遑多让。从中可以看出,信息隐藏,尤其是结构性信息隐藏是多么的重要! |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |