9️⃣
[読書メモ]オブジェクト設計スタイルガイド 7章 6節 with TypeScript
オブジェクト設計スタイルガイドを読みながら、TypeScriptでやるならどうやるかを考えながら書きました。
要約的に読める内容になっていると思うので、サクッと3分ぐらいで読める記事となっています。
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