抽象漏洞定律
抽象漏洞定律(The Law of Leaky Abstractions)是一个有关程式的定律。最早是由Joel Spolsky在其部落格中提出,其定义为“所有非不证自明的抽象概念,都有某种程度的疏漏”(原文:All non-trivial abstractions, to some degree, are leaky)。
抽象漏洞定律说明了为什么所有的程式都有Bug,同时也说明了,电脑语言的进步,虽然可以减少程式制作的时间,但是相对来说,程序员却要付出更多的学习时间。
抽象漏洞定律说明了软件本质上的缺陷,然而也提供了一个思考如何避免问题发生的方向。
举例
在Joel Spolsky的部落格中,举了几个有趣的例子,解释何为抽象漏洞定律。
ASP.NET
ASP.NET宣称其建立了一个抽象界面,透过这种抽象界面,程序员可以只点选几个选单,或是点击几个使用者界面上的按钮,就“假装”写了整个网站所需要的程式了。在这个抽象界面的背后,ASP.NET负责了程式实体化的工作。
举个例子,程序员可以制作一个利用连结来上传表格的网页(从HTML来看也就是利用<A>来上传<FORM>,一般标准的HTML,只能用“提交”这个按钮来上传表格,不能用<A>来上传<FORM>的),ASP.NET内部为了要完成这个功能,必须借助JavaScript来完成,但是这点是不会让程序员知道的。虽然的确大大的降低程式制作的时间,但是万一网页使用者关闭了JavaScript的功能,网页就会出问题。
如果程序员没有受过足够的训练,不了解ASP.NET内部运作的原理,或是不了解HTML,不了解JavaScript,就不可能找到这个问题的原因。所以说,这个ASP.NET宣称完美的抽象界面,是有很大的漏洞的。
面向对象语言
另外也可以从面向对象语言来看(C++或是JAVA),何为抽象漏洞定律就是抽象界面与实体化执行的分离。
一个物件使用另一个物件的服务,只需要知道他所提供的抽象界面为何,不需要了解内部的执行方法。在这个内部的执行,可能又透过另一个物件的抽象界面,使用另一个物件所提供的服务。在这条供应链上,只要任何一个执行出了问题,就可以让他下游所有的抽象界面产生漏洞。
反过来说,如果整条供应链的执行都没有问题,理论上,就没有漏洞的问题了。然而,电脑在硬件上的物理限制,例如:记忆体用尽,电力丧失,网络断线等,要保持100%的零缺失,是完全不可能的事。