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