抽象漏洞定律

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

参考文献
Joel Spolsky的文章 

软件设计模式