🕓

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

2024/02/24に公開

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

5.1 メソッドを実装するためのテンプレート

function method() {
// 事前条件のチェック

// 失敗のシナリオ

// ハッピーパス

// 事後条件のチェック

// void or 特定の型の返却
}

5.1.1 事前条件のチェック

渡された引数の検証をしようという話。
nullチェックなど特に忘れないようにしたい。

if (!name) {
  throw new Error("err")
}

5.1.2 失敗のシナリオ

メソッド自身が失敗のシナリオとして認識しているケース

function getNameById(id: number) {
  const name = db.find(id)
  if (!name) {
    throw new Error("err")
  }
}

5.1.3 ハッピーパス

何も問題なくメソッドを実行している部分のこと。
メソッドを小さくするとこの部分ではあまり多くのことは起こらない

5.1.4 事後条件のチェック

ほとんどのケースでは必要ない
テストを書いてあれば、そもそも不要。
呼び出す関数が怪しかったりする場合には有効になることも。

function getName(id: number, tenantId: string) {
  const nameRow = db.find(id, tenantId)

  // 略
  
  // 事後条件のチェック
  if (nameRow.tenantId !== tenantId) {
    throw new Error("")
  }
}

5.1.5 戻り値

可読性のためのtipsとして、早期returnを使おう。

// 早期return 使っていない場合 (コードは雑です)

function getName(id: number, tenantId: string) {
  const nameRow = db.find(id, tenantId)
  if (nameRow.name === "aaa") {
    nameRow.name += "!"
  }
  return nameRow.name 
}

// 早期return 使っている場合 (コードは雑です)

function getName(id: number, tenantId: string) {
  const nameRow = db.find(id, tenantId)
  if (nameRow.name !== "aaa") {
    return nameRow.name
  }
  return nameRow.name + "!"
}

Discussion