4️⃣
[読書メモ]オブジェクト設計スタイルガイド 2章7節 with TypeScript
オブジェクト設計スタイルガイドを読みながら、TypeScriptでやるならどうやるかを考えながら書きました。
要約的に読める内容になっていると思うので、サクッと3分ぐらいで読める記事となっています。
2.7 全ての依存関係を明示する
全ての依存関係をコンストラクタ引数として渡すこと。
- スタティック
- 複雑な関数は、以下の場合はオブジェクトの依存関係にすると良い
- 提供された振る舞いをラップさせたくなる場合
- 依存関係の振る舞いは、数行のカスタムコードで同じ結果を得られないほど複雑
- プリミティブでなく、オブジェクトを扱っている
- システムコールを明示する
複雑な関数の例
JSON.stringifyを直接使用するのではなく、JsonEncoderを用意しておくことで依存を明示できるようになる
class JsonEncoder {
encode(data) {
try {
return JSON.stringify(data);
} catch {
throw new Error("err");
}
}
}
class ResponseFactory {
constructor(private encoder: JsonEncoder) {}
createResponse(data) {
return new Response(this.encoder.encode(data));
}
}
システムコールを明示する例
interface Clock {
currentTime(): Date;
}
class Task {
constructor(private clock: Clock) {}
hoge() {
return this.clock.currentTime();
// this.deadline = new Date();
// と暗黙的な依存を入れると、テストが難しくなるなどの弊害が出る。
}
hoge2(now: Date) {
return now;
// もはやClockへの依存もやめてしまうのもあり
}
}
Discussion