抽象漏洞定律

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


参考文献