基本介紹
- 中文名:抽象漏洞定律
- 外文名:The Law of Leaky Abstractions
簡介,舉例,ASP.NET,面向對象語言,
簡介
抽象漏洞定律(The Law of Leaky Abstractions)是一個有關程式的定律。最早是由Joel Spolsky在其部落格中提出,其定義為“所有非不證自明的抽象概念,都有某種程度的疏漏”(原文:All non-trivial abstractions, to some degree, are leaky)。
抽象漏洞定律說明了軟體本質上的缺陷,然而也提供了一個思考如何避免問題發生的方向。
舉例
在Joel Spolsky的部落格中,舉了幾個有趣的例子,解釋何為抽象漏洞定律。
ASP.NET
ASP.NET宣稱其建立了一個抽象界面,透過這種抽象界面,程式設計師可以只點選幾個選單,或是點擊幾個使用者界面上的按鈕,就“假裝”寫了整個網站所需要的程式了。在這個抽象界面的背後,ASP.NET負責了程式實體化的工作。
舉個例子,程式設計師可以製作一個利用連結來上傳表格的網頁(從HTML來看也就是利用<A>來上傳<FORM>,一般標準的HTML,只能用“提交”這個按鈕來上傳表格,不能用<A>來上傳<FORM>的),ASP.NET內部為了要完成這個功能,必須藉助JavaScript來完成,但是這點是不會讓程式設計師知道的。雖然的確大大的降低程式製作的時間,但是萬一網頁使用者關閉了JavaScript的功能,網頁就會出問題。
如果程式設計師沒有受過足夠的訓練,不了解ASP.NET內部運作的原理,或是不了解HTML,不了解JavaScript,就不可能找到這個問題的原因。所以說,這個ASP.NET宣稱完美的抽象界面,是有很大的漏洞的。
面向對象語言
一個物件使用另一個物件的服務,只需要知道他所提供的抽象界面為何,不需要了解內部的執行方法。在這個內部的執行,可能又透過另一個物件的抽象界面,使用另一個物件所提供的服務。在這條供應鏈上,只要任何一個執行出了問題,就可以讓他下游所有的抽象界面產生漏洞。
反過來說,如果整條供應鏈的執行都沒有問題,理論上,就沒有漏洞的問題了。然而,電腦在硬體上的物理限制,例如:記憶體用盡,電力喪失,網路斷線等,要保持100%的零缺失,是完全不可能的事。