1️⃣
[読書メモ]オブジェクト設計スタイルガイド 2章1~2節 with TypeScript
初めに
オブジェクト設計スタイルガイドを読みながら、TypeScriptでやるならどうやるかを考えながら書きました。
要約的に読める内容になっていると思うので、サクッと3分ぐらいで読める記事となっています。
サービスの作成
オブジェクトには2種類あり、そのうちの1つについて2章で取り扱う
2.1 2種類のオブジェクト
1つ目:タスクを実行 or 情報を返す
何度でも使用可能、サービス
と呼ばれる
実行者であり、コントローラ・レンダラなど実行内容を表す名前を持つ
ex. EventDispatcher,UserRepository
2つ目:データを保持し、必要に応じてデータを操作・取得する振る舞いを公開する
ex. Product,Credentials
2.2 依存関係・設定値をコンストラクタ引数として渡す
依存関係・設定値をコンストラクタ引数として渡すことで、サービスが仕事をする上での設定を完了させて、インスタンス化後すぐにサービス利用できる。
// 注入するもの
interface Formatter {
fmt(msg: string): string;
}
class DefaultFormatter implements Formatter {
constructor() {}
fmt = (msg: string) => {
const line = "---------------------";
return line + "\n" + msg + "\n" + line;
};
}
type FileOption = {
path: string;
};
interface Logger {
log(msg: string): void;
}
// 注入されるもの
class FileLogger implements Logger {
constructor(private formatter: Formatter, private fileOption: FileOption) {}
log = (msg: string) => {
console.log(this.fileOption.path);
console.log(this.formatter.fmt(msg));
};
}
const logger = new FileLogger(
new DefaultFormatter(), // 依存関係を注入する
{ path: "log/text.txt" } // 設定値を注入する
);
logger.log("こんにちは");
log/text.txt
---------------------
こんにちは
---------------------
2.2.1 一緒に使うべき設定値をまとめる
自然なまとまりの単位で渡すことが大切です。
class NG {
constructor(
private email: string,
private pass: string,
) {}
}
type Credentials = {
private email: string,
private pass: string,
}
class Good {
constructor(
private credential: Credentials,
) {}
}
Discussion