7️⃣
[読書メモ]オブジェクト設計スタイルガイド 7章3節 with TypeScript
オブジェクト設計スタイルガイドを読みながら、TypeScriptでやるならどうやるかを考えながら書きました。
要約的に読める内容になっていると思うので、サクッと3分ぐらいで読める記事となっています。
7.3 外部からだけでなく内部からもサービスをイミュータブルにする
NG
class Mailer {
private sendAddress: string[] = []
sendEmail(email: string, subject: string, body: string) {
// すでに送っているものは送らない
if (this.sendAddress.includes(email)) {
return
}
// 送信
/// ...
}
}
これだと、Mailerクラスのインスタンスが複数ある場合、sendAddressが共有されてしまうため、意図しない動作をする可能性がある。
また内部の状態を変更してしまうため、テストがしにくくなる。
OK
上記で本当に欲しいのは、uniqueなemailを持つMailerクラスのインスタンスであるため、以下のようにする。
class Recipients {
private _addresses: string[] = []
get addresses() {
return this._addresses
}
add(email: string) {
if (this._addresses.includes(email)) {
return
}
this._addresses.push(email)
}
}
class Mailer {
private sendAddress = new Recipients()
sendEmail(email: string, subject: string, body: string) {
if (this.sendAddress.addresses.includes(email)) {
return
}
// 送信
/// ...
}
}
Discussion