3️⃣

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

2024/02/13に公開

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

4.1 エンティティ:変更を追跡し、イベントを記録する識別可能なオブジェクト

例:SalesInvoice エンティティ

type Line = {
  name: string;
  pay: number;
};

type SalesInvoiceId = number;

class SalesInvoice {
  private lines: Line[];
  private finalized: boolean;

  // エンティティは時間の経過とともに変化する。
  // そのため、識別可能である必要があるため、識別子を追加する。
  public readonly id: SalesInvoiceId;

  private events: string[]

  private constructor(id: SalesInvoiceId) {
    this.id = id;
    this.lines = [];
    this.finalized = false;
    this.events = []
  }

  // 請求書を作成できる
  public static create(id: SalesInvoiceId) {
    return new SalesInvoice(id);
  }

  // 請求書を追加できる
  addLine(line: Line) {
    if (this.finalized) {
      throw new Error("確定済みです");
    }
    this.lines.push(line);
  }

  // 請求書を確定できる
  finalize() {
    this.finalized = true;

    this.events.push("確定された")
  }

  // 有用な情報を公開する
  totalAmount() {
    return this.lines.reduce((a, x) => {
      return a + x.pay;
    }, 0);
  }

  recordedEvents() {
    return this.events
  }
}

エンティティのルールまとめ

  • 状態を変更するメソッドの戻り値はvoidで、メソッドは命令形でないといけない。

  • メソッドは、状態が無効になることを防ぐ必要がある。(addLineのチェック処理など...)

  • 内部情報は、何が起こっているかをテストするという理由で公開すべきではない。その代わり、変更履歴を残して公開しよう。

Discussion