1️⃣

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

2024/02/01に公開

初めに

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

サービスの作成

オブジェクトには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