• SIS Lab
  • >
  • Blog
  • >
  • DartのCascade notation(カスケード表記)とは

DartのCascade notation(カスケード表記)とは

更新日:2020.07.16 作成日:2020.02.20

Dartを触っていて..という書き方を見ましたが、どういったものか、そもそも読み方からして分からなかったので自分用のメモです。

どうやら、..Cascade notationというDartのSyntaxのようです。

Cascade notation/カスケード表記とは

Cascades (..) allow you to make a sequence of operations on the same object. In addition to function calls, you can also access fields on that same object. This often saves you the step of creating a temporary variable and allows you to write more fluid code.
Language tour | Dart

  • Cascade(..)は、同じオブジェクトに対して複数の操作を指定できる
  • 関数呼び出しに加えて、同じオブジェクトのフィールドにアクセスできる
  • オブジェクトそのものを表す一時変数を省略でき、より簡潔に記述できる

公式ドキュメントには以下の例が載っています。Cascade notation(カスケード表記)を利用する場合は、オブジェクトそのものを示す一時変数が不要になるため、利用しない場合より簡潔に表現できます。

Cascade notationを利用する場合

querySelector('#confirm') // Get an object.
  ..text = 'Confirm'      // Use its members.
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));

Cascade notationを利用しない場合

var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));

Cascade notation/カスケード表記の利用シーン

必須項目はコンストラクタの引数で渡して、その他の任意項目(オプション)はCascade notationで設定するというシーンで利用できそうです。 (簡易的なBuilderパターンとして利用する)

以下は、APIオブジェクト生成時にCascade notationを利用した例です。 accessKeysecretKeyはコンストラクタで渡して、その他の項目はCascade notationで設定してみました。

メソッドチェーンの要領で指定できるため便利そうです。

final paapi = PaAPI('accessKey', 'secretKey')
  ..region = 'region'
  ..service = 'service'
  ..host = 'host'
  ..path = 'path'
  ..partnerTag = 'partnerTag';

Cascade notation利用時の注意点

  • Cascade notationを利用して関数を呼び出す場合は、オブジェクト自身を返さないといけません。以下の例だと、sb.write()voidのため動きません。
var sb = StringBuffer();
sb.write('foo')
  ..write('bar'); // Error: method 'write' isn't defined for 'void'.

参考