💟

Dartでビルダーパターンを作ってみた!

2023/12/15に公開

Overview

ビルダーパターンは、ソフトウェア設計パターンの一つで、複雑なオブジェクトの生成を簡単にするためのパターンです。特に、オブジェクトが多くのパラメータを持つ場合や、オブジェクトの作成プロセスが複雑な場合に有用です。

ビルダーパターンでは、オブジェクトの生成を「ビルダー」と呼ばれる別のオブジェクトに委譲します。ビルダーは、オブジェクトの作成を段階的に行い、最終的に完成したオブジェクトを返します。

ビルダーパターンの主な利点は以下の通りです:

コードの可読性と保守性を向上させます。ビルダーパターンを使用すると、複雑なオブジェクトの生成コードを分割して、各部分を個別に理解しやすくすることができます。

オブジェクトの不変性を保つことができます。ビルダーは、オブジェクトが完全に構築されるまでそのオブジェクトを変更することができません。

パラメータの数が多いコンストラクタを避けることができます。ビルダーパターンを使用すると、必要なパラメータだけを設定してオブジェクトを生成することができます。

コードの再利用性を向上させます。同じビルダーを使用して、異なるパラメータで複数のオブジェクトを生成することができます。

summary

Dartで書くとこのようになります。

サンプル
class Person {
  String name;
  String address;
  int age;

  Person(this.name, this.age, this.address);
  // Person型のupdateAddressメソッドを定義。これはPersonBuilder型の引数を受け取る
  Person updateAddress(void Function(PersonBuilder) updates) {
    // PersonBuilderを生成し、updates関数を実行する
    var builder = PersonBuilder(this);
    // updates関数の中でPersonBuilderのsetAddressメソッドを実行する
    updates(builder);
    // PersonBuilderのbuildメソッドを実行し、Person型に変換して返す
    return builder.build();
  }
}
// PersonBuilderクラスを定義
class PersonBuilder {
  String name;
  String address;
  int age;
  // PersonBuilderのコンストラクタ。Person型の引数を受け取る
  PersonBuilder(Person person)
      : name = person.name,
        address = person.address,
        age = person.age;
  // PersonBuilderのsetAddressメソッド。String型の引数を受け取る
  void setAddress(String address) {
    this.address = address;
  }
  // PersonBuilderのbuildメソッド。Person型を返す
  Person build() {
    return Person(name, age, address);
  }
}

void main() {
  // Person型のインスタンスを生成
  var person = Person('Jboy', 34, 'Tokyo');
  // updateAddressメソッドを実行し、((b) => b..setAddress('東京都武蔵野'))を引数として渡す
  person = person.updateAddress((b) => b..setAddress('東京都武蔵野'));

  print('名前: ${person.name}, 年齢: ${person.age}, 住所: ${person.address}');
}

実行結果

名前: Jboy, 年齢: 34, 住所: 東京都武蔵野

thoughts

今回は難しいコードを書いてみました。最近携わったプロジェクトで、OpenAPIと呼ばれているコードの内部のコードなのか、引数を渡すときにコールバック..(カスケード)の文法の知識が必要でした。ソフトウェアの設計をするときに、このようなロジックを書く場面があるので、理解を深めたいと思って単純なサンプルコードですが、書いてみました。

Discussion