抽象漏洞定律

抽象漏洞定律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%的零缺失,是完全不可能的事。


参考文献