簡介
流式接口通常採取方法瀑布調用(具體說是方法鏈式調用)來轉發一系列對象方法調用的上下文。這個上下文(context)通常是指:
•通過被調方法的返回值定義
•自引用,新的上下文等於老的上下文
•返回一個空的上下文來終止
C++的iostream流式調用就是一個典型的例子。Smalltalk在1970年代就實現了方法瀑布調用。
設計一個好的流暢API並不像從方法中返回“this”那么容易。可讀性是流暢API的一個關鍵方面,需要您注意如何命名和構造代碼。實現流暢的API也很可能會增加代碼的複雜性。但是,如果設計得當,流暢的API具有很強的可發現性並提高了代碼的可讀性。
流暢接口中的方法通常可以連結,從而創建方法調用流。要允許連結方法,只有一條規則:
該方法必須返回非void值。
由於方法的返回類型決定了接下來可以調用哪種方法,因此它確定了它的流程。
以下是非流動方法:
就像Log()方法返回void,不可能有方法調用鏈:
我們可以通過返回一個非空類型來補救這個問題:
Log()方法返回Flowing實例時,我們可以調用哪些方法Log()已經結束了。我們可以將調用連結到Log()方法:
如果我們改變Log()方法的返回類型,則流更改為該類型:
設計原則
可讀性:在設計FLUENT界面時,對可讀性的設計是非常重要的。
高級函式:有時類具有多個較低級別的屬性或函式,這些屬性或函式通常是一起修改的。在這些情況下,可以通過提供更高級別的抽象來提高可讀性。
預先填充的欄位:在某些情況下,你可以期望通常使用一組特定的參數調用代碼。在這種情況下,提供具有該組參數的預先填充的實例可能是方便的。
發展歷史
“Fluent Interface”這個術語是在2005年底創造出來的,儘管這種整體界面風格可以追溯到20世紀70年代的Smalltalk的方法級聯發明,也是20世紀80年代的很多例子。 一個常見的例子是C ++中的iostream庫,它使用<<或>>操作符來傳遞訊息,將多個數據傳送到同一對象,並允許“操縱器”用於其他方法調用。 其他早期的例子包括Garnet系統(從1988年在Lisp)和Amulet系統(從1994年在C ++),它使用這種風格進行對象創建和屬性分配。
實例
JavaScript
用於資料庫查詢的jQuery:
JavaScript使用原形繼承與‘this’。
Java
jOOQ庫模擬了SQL
C#
流式接口可用於一系列方法,他們運行在同一對象上。
C++
Ruby
Ruby語言允許修改核心類,這使得流式接口成為原生易於實現。
Scala
Scala支持使用方法和使用關鍵字的方法調用和類混合的流暢語法,例如:
Perl 6
在Perl 6中,有許多方法,但最簡單的方法之一是將屬性聲明為讀/寫並使用給定的關鍵字。類型注釋是可選的,但是本機漸進式類型使得直接寫入公共屬性更加安全。
PHP
在PHP中,可以使用表示實例的特殊變數$this返回當前對象。因此返回$this將使方法返回實例。下面的示例定義了一個Employee類和三個方法來設定它的名稱、姓和薪水。每個Employee類的實例允許調用這些方法。
Python
Python通過在實例方法中返回‘self’: