Builderパターン

概要

複雑なオブジェクトに対して、たくさんのsetterを用意して、オブジェクトの生成を簡単にするためのパターン

bad

(rustで表現しづらいのでTSで)

class User {
  name: string;
  age: number;
  email: string;
  address: string;
  phoneNumber: string;

  constructor(name: string, age: number, email: string, address: string, phoneNumber: string) {
    this.name = name;
    this.age = age;
    this.email = email;
    this.address = address;
    this.phoneNumber = phoneNumber;
  }
}

// 初期化処理が絶望
const user = new User('Alice', 30, 'alice@example.com', '123 Main St', '555-1234');

good

キーワード引数を使うという手もあるが…

class User {
  name: string;
  age: number;
  email: string;
  address: string;
  phoneNumber: string;

  setName(name: string): this {
    this.name = name;
    return this;
  }

  setAge(age: number): this {
    ...
  }

  setEmail(email: string): this {
    ...
  }

  setAddress(address: string): this {
    ...
  }

  setPhoneNumber(phoneNumber: string): this {
    ...
  }
}

const user = User.new()
  .setName('Alice')
  .setAge(30)
  .setEmail('alice@example.com')
  .setAddress('123 Main St')
  .setPhoneNumber('555-1234');

どの値がどのインスタンス変数に対応しているのかがわかりやすくなった

使い所

  • キーワード引数の機能がない言語を使っているパターン
    • Javaとかはこのパターンがよく使われる

注意点

  • 普通にキーワード引数があるときは、キーワード引数を使う方がシンプルでわかりやすい

参考