抽象漏洞定律(The Law of Leaky Abstractions)是一個有關(guān)程式的定律。最早是由Joel Spolsky在其部落格中提出,其定義為“所有非不證自明的抽象概念,都有某種程度的疏漏”(原文:All non-trivial abstractions, to some degree, are leaky)。
簡介抽象漏洞定律(The Law of Leaky Abstractions)是一個有關(guān)程式的定律。最早是由Joel Spolsky在其部落格中提出,其定義為“所有非不證自明的抽象概念,都有某種程度的疏漏”(原文:All non-trivial abstractions, to some degree, are leaky)。
抽象漏洞定律說明了為什么所有的程式都有Bug,同時也說明了,電腦語言的進(jìn)步,雖然可以減少程式制作的時間,但是相對來說,程序員卻要付出更多的學(xué)習(xí)時間。
抽象漏洞定律說明了軟件本質(zhì)上的缺陷,然而也提供了一個思考如何避免問題發(fā)生的方向。1
舉例在Joel Spolsky的部落格中,舉了幾個有趣的例子,解釋何為抽象漏洞定律。
ASP.NETASP.NET宣稱其建立了一個抽象界面,透過這種抽象界面,程序員可以只點選幾個選單,或是點擊幾個使用者界面上的按鈕,就“假裝”寫了整個網(wǎng)站所需要的程式了。在這個抽象界面的背后,ASP.NET負(fù)責(zé)了程式實體化的工作。
舉個例子,程序員可以制作一個利用連結(jié)來上傳表格的網(wǎng)頁(從HTML來看也就是利用來上傳,一般標(biāo)準(zhǔn)的HTML,只能用“提交”這個按鈕來上傳表格,不能用來上傳的),ASP.NET內(nèi)部為了要完成這個功能,必須借助JavaScript來完成,但是這點是不會讓程序員知道的。雖然的確大大的降低程式制作的時間,但是萬一網(wǎng)頁使用者關(guān)閉了JavaScript的功能,網(wǎng)頁就會出問題。
如果程序員沒有受過足夠的訓(xùn)練,不了解ASP.NET內(nèi)部運(yùn)作的原理,或是不了解HTML,不了解JavaScript,就不可能找到這個問題的原因。所以說,這個ASP.NET宣稱完美的抽象界面,是有很大的漏洞的。
面向?qū)ο笳Z言另外也可以從面向?qū)ο笳Z言來看(C++或是JAVA),何為抽象漏洞定律就是抽象界面與實體化執(zhí)行的分離。
一個物件使用另一個物件的服務(wù),只需要知道他所提供的抽象界面為何,不需要了解內(nèi)部的執(zhí)行方法。在這個內(nèi)部的執(zhí)行,可能又透過另一個物件的抽象界面,使用另一個物件所提供的服務(wù)。在這條供應(yīng)鏈上,只要任何一個執(zhí)行出了問題,就可以讓他下游所有的抽象界面產(chǎn)生漏洞。
反過來說,如果整條供應(yīng)鏈的執(zhí)行都沒有問題,理論上,就沒有漏洞的問題了。然而,電腦在硬件上的物理限制,例如:內(nèi)存用盡,電力喪失,網(wǎng)絡(luò)斷線等,要保持100%的零缺失,是完全不可能的事。1
本詞條內(nèi)容貢獻(xiàn)者為:
李嘉騫 - 博士 - 同濟(jì)大學(xué)