Dartには Extension methods | Dart というのがある。ぼんやり思っていることをメモしておく
前提
extensionは
- クラスにメソッドを追加することができる
- テストするためにクラスを作る必要がある
- インスタンスフィールドは持てない
- クラスの責務の大きさはextensionで切り出しても小さくならない
思っていること
変更できないクラスにどこでも使えるメソッドを生やすのはいいと思う
- 変更できないクラスとは、StringやListなどDartが提供しているクラスやライブラリが提供しているクラス
- どこでも使えるメソッドとは、Listをsliceするとか特定のドメインを扱う時のみ利用するメソッドではないもの
ほとんどがdartxやdart:collectionにあると思われる。
逆に言えば、以下のようなパターンはextensionは使わずクラスを定義したほうがよいと思う
- 自分が定義したクラス
- 特定のドメインのみを扱う時に利用するメソッド
別クラスとして定義して、テストをする時に依存する情報を減らしたりクラス自体を小さくしたほうがいいと思う。
一応例外はあって、enumは自分が定義していて特定のドメインでのみ扱う場合でもextensionを使っている。そうしないとenumにメソッド生やせないので。
extensionを定義する場所をまとめる
様々な箇所でextensionを実装すると似たようなextensionが生えたり別でクラスを作ったりしてしまいそうなので、すべてまとめておいてまとめてexportする形にしておくのがよかったかもしれないと思っている。
変更できないクラスにどこでも使えるメソッドを生やすというルールだったらそれが出来る気がする。
リファクタリングをするために"一時的に"別ファイルに持って行くために利用する
リファクタリングを行う時に変更回数が多い+コードの行数が長いファイルをまず別ファイルに切り出してから少しずつリファクタリングすることがある。extensionを使えば簡単にクラスから別ファイルに切り出すことができる。ただ切り出し方にも工夫は必要で、例えばたくさんある切り出したいメソッドをまとめて別ファイルに切り出すというようなやり方をしてしまうと結局大きなファイルになってしまうのでクラスとして切り出すことを想定して切り出す必要はある。
また切り出して終わりにするとクラスは責務過多のままなので、ちゃんとリファクタリングしていく必要がある。
まとめ
僕はDartのextensionはあんま使う必要がないなと思っていますがみなさんはどうでしょうか