🔟

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

2024/02/20に公開

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

4.10 モディファイアメソッドの呼び出しでは常に有効なオブジェクトを生成する

ドメイン不変条件を保護するために、アサーションをどこでするか・どうするかが大切だという話。

class TotalDistanceTraveled {
  private totalDistance: number

  constructor(totalDistance: number) {
    this.validateTotalDistance(totalDistance)
    this.totalDistance = totalDistance
  }

  private validateTotalDistance(distance: number) {
    if (distance <= 0) {
      throw new Error ("you cannot add negative distance")
    }
  }

  // コンストラクタで検証した方がより安全ではある。
  add(distance: number) {
    this.validateTotalDistance(distance)
    return new TotalDistanceTraveled(this.totalDistance + distance)
  }
}

分数の例などを考えると、コンストラクタで分母が必ず0にならないことをチェックする。
各メソッドでチェックするのは面倒なので、コンストラクタを介するのが良い。

class Fraction {
  constructor(private bunbo: number, private bunshi: number) {
    if (bunbo === 0) {
      throw new Error ("分母は0にできないよ")
    }
  }

  withBunbo(newBunbo: number) {
    return new Fraction(newBunbo, this.bunshi)
  }
}

Discussion