6️⃣

[読書メモ]オブジェクト設計スタイルガイド 2章10節 with TypeScript

2024/02/06に公開

オブジェクト設計スタイルガイドを読みながら、TypeScriptでやるならどうやるかを考えながら書きました。
要約的に読める内容になっていると思うので、サクッと3分ぐらいで読める記事となっています。
https://www.oreilly.co.jp/books/9784814400331/

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