9️⃣

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

2024/03/09に公開

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

7.6 システム協会を超える子メンドに対する抽象を定義する

class SendMessageToRabbitMq {
  // ...

  whenUserChangedPassword(user: User) {
    this.rabbitMqConnection.publish(
      'user_event',
      'user.changedPassword',
      JSON.stringify(user)
    );
  }
}
```ts

これはアプリケーションの外側にあるため、抽象化が必要になる

```ts
interface Queue {
  publishUserChangedPassword(user: User): void;
}

class RabbitMqQueue implements Queue {
  publishUserChangedPassword(user: User) {
    this.rabbitMqConnection.publish(
      'user_event',
      'user.changedPassword',
      JSON.stringify(user)
    );
  }
}

class SendMessage {
  constructor(private queue: Queue) {}

  whenUserChangedPassword(user: User) {
    this.queue.publishUserChangedPassword(user);
  }
}

最初のうちは抽象を導入したが、メソッドをより汎用的にするために、汎化を適用することができる
汎化:抽象化をより一般的なものにすること

interface CanPublishToQueue {
  queueName: string;
  eventName: string;
  eventData: string[];
}


class RabbitMqQueue implements Queue {
  publishUserChangedPassword(canPublishToQueue:CanPublishToQueue) {
    this.rabbitMqConnection.publish(
      canPublishToQueue.queueName,
      canPublishToQueue.eventName,
      JSON.stringify(canPublishToQueue.eventData)
    );
  }
}

汎化を適用すると、抽象が複雑になるため、適用するタイミングを見極める必要がある。
抽象でサポートするケースが増えると、抽象が複雑になるため、適用するタイミングを見極める必要がある。

Discussion