6️⃣
[読書メモ]オブジェクト設計スタイルガイド 2章10節 with TypeScript
オブジェクト設計スタイルガイドを読みながら、TypeScriptでやるならどうやるかを考えながら書きました。
要約的に読める内容になっていると思うので、サクッと3分ぐらいで読める記事となっています。
2.10 コンストラクタの中ではプロパティへの代入以外は何もしない
コンストラクではあくまでプロパティへの代入と検証のみにとどめておくのが良いマナーとされている。
本の例では、this.translatorがnullの状態でメソッドが使用されるのでよくないと書いてあったが、Tsならビルド時にエラーが出るはず。
class NG_Mailer{
private translator: Translator
private subject: string
constructor(translator: Translator,locale: string) {
this.subject = this.translator.translate() // nullのメソッドを使用している
this.translator = translator
}
}
class Translator{
translate() {}
}
NG例
class MySQLtableGateway {
private connection: Connection;
constructor(connectionConfig: ConnectionConfig, private tableName: string) {
this.connect(connectionConfig);
}
connect(connectionConfig: ConnectionConfig) {
this.connection = new Connection();
}
insert(data: any) {
this.connection.insert(this.tableName, data);
}
}
class Connection {
insert(tableName: string, data: any) {}
}
type ConnectionConfig = {};
OK例
connectionがnullable的になっているのは問題ないのだろうか...
class MySQLtableGateway {
private connection: Connection;
constructor(
private connectionConfig: ConnectionConfig,
private tableName: string
) {}
private connect() {
if (this.connection instanceof Connection) {
// まだ接続されてないか確認
return;
}
this.connection = new Connection(this.connectionConfig);
}
insert(data: any) {
this.connect();
this.connection.insert(this.tableName, data);
}
}
class Connection {
private configName: string;
constructor(private connectionConfig: ConnectionConfig) {
this.configName = connectionConfig.name;
}
insert(tableName: string, data: any) {
console.log(this.configName);
}
}
type ConnectionConfig = {
name: string;
};
const a = new MySQLtableGateway({ name: "USAGI" } as ConnectionConfig, "");
const b = new MySQLtableGateway({ name: "YAHA!" } as ConnectionConfig, "");
a.insert([]);
b.insert([]);
Discussion