こんにちは。いせりゅーです😋
この記事は、株式会社ゆめみの23卒 Advent Calendar 2023のアドベントカレンダーになります!!
色々な種類の記事が投稿されるので、お楽しみに🤗
最近、新しいトピックに取り組む際の挑戦や躓きを経験しています。そんな中、業務でのフィードバックを通じて、カスケード記法(..)の理解について新たな気づきを得ました。それを皆さんと共有したいと思います!!
問題の背景
- カスケード記法についてはなんとなく知っていたが他にもメリットがあることが知らなかった
こちらを参考にさせていただきました。
認識のミスがありましたら、コメントいただけると幸いです🙇
カスケード記法(..)とは
- 「..」を使うと、メソッドやプロパティを記載を連続して使用できるDartの文法
- 同じオブジェクトに対して一連の操作を実行できる
カスケード記法(..)を使うメリット
- コードを一時変数を作成する手間が省ける
→コードをすっきりと簡潔にできる
コードの記載例
1.簡潔に記載できる
Before
var button = querySelector('#confirm');
button?.text = 'Confirm';
button?.classes.add('important');
button?.onClick.listen((e) => window.alert('Confirmed!'));
button?.scrollIntoView();
after
querySelector('#confirm')
?..text = 'Confirm'
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'))
..scrollIntoView();
2.戻り値を操作できる
今回は、ViewModelのテストコードから引っ張ってきました。今回は、カスケード記法を使うかどうかで戻り値が変わることを見るために必要なコードのみを記載します。
全体的なコードはこちらになります。
weather_repository.dart
Result<WeatherResult, String> getWeather(WeatherRequest weatherRequest) {
try {
final weatherDecode = weatherDataSource.fetchWeather(weatherRequest);
final result = WeatherResult.fromJson(weatherDecode);
return Result.success(result);
} on YumemiWeatherError catch (error) {
switch (error) {
case YumemiWeatherError.unknown:
return const Result.failure(ErrorMessage.unknown);
case YumemiWeatherError.invalidParameter:
return const Result.failure(ErrorMessage.invalidParameter);
}
} on Exception catch (_) {
return const Result.failure(ErrorMessage.other);
}
WeatherScreenViewModel create() =>
container.read(weatherScreenViewModelProvider().notifier);
// 戻り値がResult<WeatherResult, String>になる。
final hoge = create().reloadWeather();
// 戻り値がWeatherScreenViewModelになる
final fuga = create()..reloadWeather();
解説
final hoge = create().reloadWeather();
-
reloadWeather
を呼び出すため、戻り値は、Result<WeatherResult, String>
になります
final fuga = create()..reloadWeather();
-
reloadWeather()
メソッドの戻り値は無視され、create()
メソッドによって生成されたWeatherScreenViewModel
オブジェクトが fuga 変数に格納される。
最後に
- 僕自身は、
..
については認知はしていましたが、カスケード記法という名前であることやできることについて知りませんでした。