🕑

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

2024/02/22に公開

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

4.11 内部で記録されたイベントを使用してミュータブルオブジェクトの変更を検証する

ミュータブルオブジェクトの場合、ドメインイベントを記録しておいてその記録が含まれるかをテストするのがフレイキーになりにくくて良いよ。といった話。

class Position {
  constructor(private x: number, private y: number) {}

  private clone() {
    return new Position(this.x, this.y);
  }

  toTheLeft(steps: number) {
    let copy = this.clone();
    copy.x = copy.x - steps;
    return copy;
  }
}

class PlayerMoved {
  constructor(private position: Position) {}
}

class Player {
  events: PlayerMoved[];

  constructor(private position: Position) {
    this.events = [new PlayerMoved(position)];
  }

  moveLeft(step: number): void {
    if (step === 0) {
      return;
    }

    this.position = this.position.toTheLeft(step);
    this.events.push(new PlayerMoved(this.position));
  }
}

test("it_can_be_left", () => {
  const init_position = new Position(10, 2);
  const player = new Player(init_position);

  player.moveLeft(8);

  expect(player.events).toContainEqual(new PlayerMoved(new Position(2, 2)));
});

Discussion