オブジェクト指向プログラミングでは、メソッド カスケードは、同じオブジェクトで複数のメソッドを呼び出すことを可能にする構文です。これは、特に流れるようなインターフェイスに適用されます。
たとえば、Dartでは、カスケードは次のようになります。
a .. b ()
.. c () ;
個々の呼び出しと同等です:
a . b ();
a . c ();
メソッド カスケードはメソッド チェーニングほど一般的ではありません。これは、少数のオブジェクト指向言語でのみ見られますが、チェーニングは非常に一般的です。カスケードの形式はチェーニングを使用して実装できますが、これによりインターフェイスが制限されます。以下のメソッド チェーニングとの比較を参照してください。
応用
カスケードとは、オブジェクトを繰り返しリストする必要をなくす構文糖です。これは、単一のオブジェクトに対して多数のメソッド呼び出しを行う、 Fluent Interfaceで特に使用されます。
これは、オブジェクトが長い式の値である場合に、式を繰り返しリストしたり一時変数を使用したりする必要がなくなるため、特に便利です。たとえば、式を繰り返しリストする代わりに、
a . b (). c ();
a . b (). d ();
または一時変数を使用します:
n = a . b (); n . c (); n . d ();
カスケードにより、式を一度記述して繰り返し使用できるようになります。
a . b ().. c ()
.. d ();
メソッドチェーンとの比較
メソッド呼び出しが与えられた場合a.b()、呼び出しの実行後、メソッド カスケードはこの式を左側のオブジェクトa(変更されている場合は新しい値を含む) に対して評価し、メソッド チェーンはこの式を右側のオブジェクトに対して評価します。
- 連鎖
次のチェーン (C++ の場合):
a . b (). c ();
は、次の単純な形式と同等です。
b = a.b ( ) ; b.c ( ) ;
- カスケード
次のカスケード (Dart の場合):
a .. b ()
.. c () ;
は、次の単純な形式と同等です。
a . b ();
a . c ();
thisカスケードは、メソッドがターゲット オブジェクト (レシーバー、、 )を返すようにすることで、連鎖の観点から実装できますself。ただし、そのためには、メソッドが既にこのように実装されているか、元のオブジェクトがこれを行う別のオブジェクトでラップされている必要があり、メソッドが他の潜在的に有用な値 (または、セッターのように何も返さない方が適切な場合は何も返さない) を返さないことが必要です。流れるようなインターフェイスでは、これは多くの場合、セッターが何も返さずにこれを返すことを意味します。
言語
パスカル
with ステートメントのコンポーネント ステートメント内では、with句で指定されたレコード変数のコンポーネント (フィールド) は、フィールド識別子のみで表すことができます。つまり、レコード変数全体の表記をその前に付ける必要はありません。with 句は、指定されたレコード変数のフィールド識別子を含むスコープを効果的に開き、フィールド識別子が変数識別子として出現できるようにします。
日付の場合、月= 12の場合、開始月:= 1 、年:=年+ 1 、終了月:=月+ 1となります。
{ は } と同等です
日付.月= 12の場合、開始日付.月:= 1 ;日付.年:=日付.年+ 1で終了、それ以外の場合、日付.月:=日付.月+ 1
雑談
メソッドチェーンとカスケードはどちらもSmalltalkで導入されました。その後のほとんどのオブジェクト指向言語ではチェーンが実装されていますが、カスケードを実装したものはほとんどありません。Smalltalkでは、セミコロン演算子を使用して同じオブジェクトに異なるメッセージを送信できます。[1]
自己 listPane 親の
色: 黒色 、高さ: 17 、幅: 11
ピリオドで終了し、省略形として変数も使用する個別のステートメントと比較します。
| parent |
parent := self listPane parent .
parent color: 色は 黒.
parent height: 17 .
parent width: 11 .
微妙な点の 1 つは、カスケード内のメソッド呼び出し (「メッセージ」) の値は、レシーバーではなくyourself、メッセージの通常の値のままであることです。これは、たとえば複雑な値を構築する場合など、レシーバーの値が必要な場合に問題になります。この問題は、レシーバーを返すだけの特別なメソッドを使用することで回避できます。 [2]
オブジェクト>>あなた自身
^自己
たとえば、「コレクションにオブジェクトを追加する」メソッド ( Collection>>add: anObject) は、コレクションではなく、追加されたオブジェクトを返します。したがって、代入文のカスケードでこれを使用したい場合は、カスケードを で終わらせる必要がありますyourself。そうでない場合、値はコレクション自体ではなく、最後に追加された要素になります。
all := OrderedCollection new
add: 5 ;
add: 7 ;
自分自身.
ビジュアルベーシック
Visual Basic では、 With ステートメントを使用して、同じオブジェクトに対して任意の数のメソッド呼び出しまたはプロパティ アクセスを有効にします。
ExpressionThatReturnsAnObject . SomeFunction ( 42 ) . Property = valueで終了
With..End WithVisual Basic のブロックはネストできます。
ExpressionThatReturnsAnObject.SomeFunction ( 42 ) .Property = valueで、SubObject.SubProperty = otherValue.AnotherMethod ( 42 )で終了で終了
ダーツ
新しい言語の中でも、Dart は二重ドットの..「カスケード メソッド呼び出し操作」を使用してカスケードを実装します。Smalltalk とは異なり、Dart ではカスケード メソッド呼び出しの値はレシーバ (基本オブジェクト) であり、(カスケードされていない) メソッド呼び出しの値ではないため、 は必要ありませんyourself。Dart はプロパティ を使用するため、ゲッターとセッターにメソッド構文 ( ) を使用する代わりにfoo.getBar(); foo.setBar(b);、フィールド値/割り当て構文 ( ) を使用しfoo.bar; foo.bar = b;、カスケードは割り当てで機能します。
a ..文字列= 'Hello world!' .. done = true ;
は以下と同等です:
a . string = 'Hello world!' ; a . done = true ;
参考文献
- ^ ベック1997、「カスケード」、pp.183-185。
- ^ ベック1997、「Yourself」、pp.186-188。
- Beck, Kent (1997)。Smalltalkベストプラクティスパターン。Prentice Hall。ISBN 978-0134769042。
外部リンク
- ダーツ
- 「Dart のメソッド カスケード」、Gilad Bracha、2012 年 2 月 17 日
- マイルストーン 1 言語の変更、「カスケード」、Bob Nystrom、2012 年 7 月 (2013 年 3 月更新)
