🕐

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

2024/02/21に公開

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

4.11 モディファイアメソッドで要求された状態の変化が有効であることを検証する

状態の有効性などをテストを通して確認しようといった話。

例えば、キャンセルされた注文は配送できないなど

class SalesOrder {
  constructor(public deliveredAt?: Date, public canceledAt?: Date) {}

  markAsDelivered(at: Date) {
    if (this.canceledAt) {
      throw new Error("キャンセルされた注文は配送できません");
    }
    this.deliveredAt = at;
  }

  cancel(at: Date) {
    if (this.deliveredAt) {
      throw new Error("配送済みの注文をキャンセルできない");
    }
    this.canceledAt = at;
  }
}

test("a_delivered_order_can_not_be_canceled", () => {
  const delivered_order = new SalesOrder(new Date(), undefined);

  // () => deliveredOrder.cancel(new Date()) を使用しているのは、メソッドが実際に実行されるまで待つため
  expect(() => delivered_order.cancel(new Date())).toThrow(
    "配送済みの注文をキャンセルできない"
  );
});

Discussion