流暢なインターフェイスを構築する背後にある核となる考え方は、読みやすさです。コードを読む人は、詳細を明確にするために実装を掘り下げなくても、達成されていることを理解できる必要があります。
C#、VB.NET、Java などの最新の OO 言語では、メソッド チェーンがこれを実現する 1 つの方法ですが、それが唯一の手法ではありません。他の 2 つはファクトリ クラスと名前付きパラメーターです。
また、これらの手法は相互に排他的ではないことに注意してください。目標は、アプローチの純粋さではなく、コードの読みやすさを最大化することです。
メソッドチェーン
メソッド チェーンの背後にある重要な洞察は、決して void を返すメソッドを持たないことですが、常に何かのオブジェクト、またはより多くの場合、さらなる呼び出しを可能にするインターフェイスを返すことです。
メソッドが呼び出されたのと同じオブジェクトを必ずしも返す必要はありません。つまり、常に「これを返す」必要はありません。
有用な設計手法の 1 つは、別のクラスの構成を可能にする fluent API を公開するインナー クラスを作成することです。
これには 2 つの利点があります。流暢な API を 1 か所に保持し、クラスの主要な機能から分離できることと、(内部クラスであるため) 他のクラスではできない方法でメイン クラスの内部をいじることができることです。
特定の時点で開発者が使用できるメソッドを制御するために、一連のインターフェイスを使用することができます。
ファクトリ クラス
一連の関連オブジェクトを構築したい場合があります。例としては、NHibernate Criteria API、Rhino.Mocks 期待値制約、NUnit 2.4 の新しい構文などがあります。
どちらの場合も、格納する実際のオブジェクトがありますが、それらを簡単に作成できるようにするために、必要なインスタンスを作成するための静的メソッドを提供するファクトリ クラスがあります。
たとえば、NUnit 2.4 では次のように記述できます。
Assert.That( result, Is.EqualTo(4));
「Is」クラスは、NUnit による評価の制約を作成するファクトリ メソッドでいっぱいの静的クラスです。
実際、浮動小数点数の丸め誤差やその他の不正確さを許容するために、テストの精度を指定できます。
Assert.That( result, Is.EqualTo(4.0).Within(0.01));
(事前にお詫びします - 私の構文が間違っている可能性があります。)
名前付きパラメータ
それらをサポートする言語 (Smalltalk および C# 4.0 を含む) では、名前付きパラメーターを使用して、メソッド呼び出しに追加の「構文」を含める方法を提供し、読みやすさを向上させます。
ファイル名を受け取る架空の Save() メソッドと、保存後にファイルに適用する権限を考えてみましょう。
myDocument.Save("sampleFile.txt", FilePermissions.ReadOnly);
名前付きパラメーターを使用すると、このメソッドは次のようになります。
myDocument.Save(file:"SampleFile.txt", permissions:FilePermissions.ReadOnly);
または、より流暢に:
myDocument.Save(toFile:"SampleFile.txt", withPermissions:FilePermissions.ReadOnly);