7️⃣

[読書メモ]オブジェクト設計スタイルガイド 7章3節 with TypeScript

2024/03/07に公開

オブジェクト設計スタイルガイドを読みながら、TypeScriptでやるならどうやるかを考えながら書きました。
要約的に読める内容になっていると思うので、サクッと3分ぐらいで読める記事となっています。
https://www.oreilly.co.jp/books/9784814400331/

7.3 外部からだけでなく内部からもサービスをイミュータブルにする

NG

class Mailer {
  private sendAddress: string[] = []

  sendEmail(email: string, subject: string, body: string) {
    // すでに送っているものは送らない
    if (this.sendAddress.includes(email)) {
      return
    }

    // 送信
    /// ...
  }
}

これだと、Mailerクラスのインスタンスが複数ある場合、sendAddressが共有されてしまうため、意図しない動作をする可能性がある。
また内部の状態を変更してしまうため、テストがしにくくなる。

OK
上記で本当に欲しいのは、uniqueなemailを持つMailerクラスのインスタンスであるため、以下のようにする。

class Recipients {
  private _addresses: string[] = []

  get addresses() {
    return this._addresses
  }

  add(email: string) {
    if (this._addresses.includes(email)) {
      return
    }

    this._addresses.push(email)
  }
}

class Mailer {
  private sendAddress = new Recipients()

  sendEmail(email: string, subject: string, body: string) {
    if (this.sendAddress.addresses.includes(email)) {
      return
    }

    // 送信
    /// ...
  }
}

Discussion