極簡介面
2005 年 12 月 5 日
極簡介面是一種 API 設計風格,我將其與 HumaneInterface 做對比。極簡介面的概念是設計一個 API,讓客戶端可以執行他們需要執行的所有操作,但將功能簡化到最小的合理方法集,以完成工作。(請參閱 HumaneInterface,了解差異的範例。)
使用 HumaneInterface 中的 ruby-array/java-list 範例,您不會在已經有索引器和長度方法的清單類別中包含 first 和 last 方法,因為您可以使用現有的介面執行 first 和 last。因此,first 和 last 是便利方法,極簡主義者並非避免所有便利方法,但便利方法必須跨越很高的門檻才能進入。
雖然 HumaneInterface 有其論點,但以下說明極簡介面的依據。
介面需要時間學習。具有龐大介面的類別不太可能被妥善使用,而且一開始就可能令人卻步。透過保留一小組重點方法,您可以讓客戶端更容易找出類別是什麼以及它能做什麼。
這種重點對類別設計者也很重要。類別設計的常見問題是讓類別執行太多工作。專注於基本要素有助於避免類別中的雜亂,讓它專注於執行一項工作並執行得很好。
如果您採用人性化的方法,您怎麼知道在哪裡停止?如果您持續新增方法,因為有人可能會需要,您將永遠沒有方法的盡頭。因此,您需要一些準則來避免這種方法爆炸。人性化的準則(提供有用的方法)是武斷且困難的。極簡主義的準則很簡單,如果客戶端可以使用現有方法執行,那麼他們就不需要額外的。
(請注意,找出什麼是有用的這個問題,對於撰寫已發布類別庫的人來說,比應用程式程式碼更是一個問題。對於應用程式程式碼,您知道它的用途,它是封閉的系統。)
如果您使用靜態型別的純介面(例如 Java 和 C# 中的介面關鍵字),則讓方法數量保持較少的另一個原因是,這可以減輕實作者的負擔。大量的方法都必須實作,這是一項繁重的任務。(使用抽象類別作為混合可以幫助減輕此負擔。)
如果您想要在最小類別中獲得更多功能,您可以使用其他類別來達成。例如,在 Java 中,如果您希望反轉或排序清單(Ruby 的陣列中的一般方法),您可以使用 Collections 工具類別。
當您在函式庫上工作時,一旦您發布它,就非常難以移除任何東西。因此,最好從一個太小的東西開始並新增東西,而不是在您無法移除東西時擁有太大的東西。