Sunday, October 15, 2017

抽象層滲漏的解決方案 --- 容許客製化的抽象層

「抽象層滲漏法則」(The law of leaky abstraction) 這個詞彙,在我寫這篇 blog 的時候,中文的維基條目還沒有創建出來,所以我的參考資料主要都是來自英文的資料。根據我查的資料,這個法則是因為 Joel Spolsky 寫了文章討論它,所以變得很流行。然而,我覺得真正有趣的部分是英文維基條目裡的一小段話。

An earlier paper by Kiczales describes some of the issues with imperfect abstractions and presents a potential solution to the problem by allowing for the customization of the abstraction itself.

「容許對抽象層的再客製化」是抽象層滲漏的可能解法?這是什麼概念?

(1) Lisp 直譯器可以視為是控制電腦的抽象層,而且這個抽象層是容許客製化的。Lisp 最著名的 macro 功能,就可以讓 Lisp 的使用者自訂自己需要的 syntax 。 換言之,Lisp 直譯器是可客製化的抽象層。Paul Graham 對於沒有 Lisp macro 的程式語言,下了如下的註解:  abstraction that not powerful enough

(2) edn 格式容許使用自訂自己需要的資料型態,並且嵌入自訂的 parser 。所以這個抽象層也是可以客製化。在 edn 的介紹文件中,它用了不同的方式解釋為什麼需要 edn ,原文大概是說,如果一個格式沒有包含足夠的資料型態,使用這個格式的程式就勢必得自行實現這些型態的特殊處理 (抽象層滲漏)  ,所以就會造成 context-dependency

(3) PostgreSQL 的 stored routine 和 user defined types 也是容許使用者訂定自己的特殊規格。這個資料庫也是一個可以客製化的抽象層。

由這個概念去思考之後,我覺得將軟體的實作設計成「容許客製化的抽象層」,算是滿重要的概念。有了這種概念,才容易設計出成熟、好用的產品。

類似的例子還有許多,比方說:
  • Emacs, Atom 編輯器容許 plugin
  • Chrome 可以安裝 plugin
  • C 語言可以嵌入組語
  • Linux kernel module
  • Redis 也有 Redis module
  • Excel 可以嵌入 VBA