Dartでイミュータブルなリストを生成する
この記事にはアフィリエイトリンクが含まれています。
はじめに
最近、ミノ駆動さんが書かれた『良いコード/悪いコードで学ぶ設計入門』を読んでいる。
その中で、ファーストクラスコレクションについて書かれた章の中で、配列型のインスタンス変数を外部に公開する際には不変にしておくと良いと書かれていた。
普段ファーストクラスコレクションを使ってはいるものの外部へは可変なままで公開していたのでなるほど確かに!と思い、Dartではどうするんだろうと思ったのがきっかけ。
結論
List.unmodifiable
というfactoryを使うと不変にできる。
class Books {
final List<Book> _values;
const Books(this._values);
List<Book> get values => List.unmodifiable(_values);
}
final books = Books([Book('title')]);
books.values.add(Book('error'));
// -> Uncaught Error: Unsupported operation: add
なお、似たような結果を実現するものとしてUnmodifiableListView
というものもある。
List.unmodifiable
の方は引数のリストをシャローコピーするのに対し、UnmodifiableListView
の方は中身は元のリストのままとなる。
この辺りのDartのリストを含めたイミュータブルに関する話は、monoさんが書かれているFlutter/Dartにおけるimmutableの実践的な扱い方を読んでおくのもおすすめする。
おわり
コードの見通しが良くなるので普段の開発では好んでイミュータブルプログラミングを選択している。
一方で、ミノ駆動さんやmonoさんも言われているように、高いパフォーマンスが必要だったりリソースに限りがある場合は注意が必要だ。
銀の弾丸はないがベターはあるはず。良いコードが書けるようにずっと考え続けたい。