連鎖を使用する場合
関数チェーンは、オートコンプリートを備えたIDEが一般的な場所である言語で主に人気があります。たとえば、ほとんどすべてのC#開発者がVisual Studioを使用しています。したがって、C#を使用して開発している場合、メソッドにチェーンを追加すると、Visual Studioがチェーンの構築を支援するため、そのクラスのユーザーの時間を節約できます。
一方、PHPのような本質的に非常に動的で、IDEでオートコンプリートをサポートしていない言語では、連鎖をサポートするクラスが少なくなります。連鎖は、正しいphpDocsを使用して連鎖可能なメソッドを公開する場合にのみ適切です。
連鎖とは何ですか?
Foo
次の2つのメソッドという名前のクラスを指定すると、どちらもチェーン可能です。
function what() { return this; }
function when() { return new Foo(this); }
1つが現在のインスタンスへの参照であり、新しいインスタンスを作成するという事実は、これらがチェーン可能なメソッドであることを変更しません。
連鎖可能なメソッドは現在のオブジェクトのみを参照する必要があるという絶対的なルールはありません。実際、連鎖可能なメソッドは2つの異なるクラスにまたがることがあります。例えば;
class B { function When() { return true; } };
class A { function What() { return new B(); } };
var a = new A();
var x = a.What().When();
this
上記の例のいずれにも参照はありません。コードa.What().When()
はチェーンの例です。興味深いのは、クラス型B
が変数に割り当てられないことです。
メソッドは、その戻り値が式の次のコンポーネントとして使用されるようになると連鎖します。
ここにいくつかの例があります
// return value never assigned.
myFile.Open("something.txt").Write("stuff").Close();
// two chains used in expression
int x = a.X().Y() * b.X().Y();
// a chain that creates new strings
string name = str.Substring(1,10).Trim().ToUpperCase();
ときに使用するthis
と、new(this)
ほとんどの言語の文字列は不変です。したがって、メソッド呼び出しをチェーンすると、常に新しい文字列が作成されます。StringBuilderのようなオブジェクトを変更できる場所。
一貫性がベストプラクティスです。
オブジェクトの状態を変更してを返すメソッドがある場合は、this
新しいインスタンスを返すメソッドを混在させないでください。代わりに、Clone()
これを明示的に行うという特定のメソッドを作成します。
var x = a.Foo().Boo().Clone().Foo();
内部で何が起こっているかについては、それがはるかに明確a
です。
外のステップと裏技
これをステップアウトおよびバックトリックと呼びます。これは、チェーンに関連する一般的な問題の多くを解決するためです。これは基本的に、元のクラスから新しい一時クラスに降りてから、元のクラスに戻ることを意味します。
一時クラスは、元のクラスに特別な機能を提供するためだけに存在しますが、特別な条件下でのみ存在します。
チェーンが状態を変更する必要がある場合がよくありますが、クラスA
はこれらすべての可能な状態を表すことができません。したがって、チェーン中に、への参照を含む新しいクラスが導入されますA
。これにより、プログラマーは状態にステップインしてに戻ることができA
ます。
これが私の例B
です。特別な状態をと呼びます。
class A {
function Foo() { return this; }
function Boo() { return this; }
function Change() return new B(this); }
}
class B {
var _a;
function (A) { _a = A; }
function What() { return this; }
function When() { return this; }
function End() { return _a; }
}
var a = new A();
a.Foo().Change().What().When().End().Boo();
これは非常に単純な例です。より詳細に制御したい場合は、さまざまなメソッドを持つB
新しいスーパータイプに戻ることができA
ます。