0️⃣

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

2024/02/10に公開

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

3.6 複合値を表現する新しいオブジェクトを抽出する

例: Amount と Currency

class Amount {
  get val() {
    return this._val
  }
  constructor(private _val: number) {
    if (_val <= 0) {
      throw new Error()
    }
  }
}
const Currency = {
  JPY: "JPY",
  USD: "USD"
} as const;
 
type Currency = (typeof Currency)[keyof typeof Currency];

class Currency_VO {
  get val() {
    return this._val
  }
  constructor(private _val: Currency) {
  }
}

// NG
class Converter{
  convert(amount: Amount, local: Currency, target: Currency) {
  }
}

// OK
class Money {
  constructor(private amount: Amount, private currency: Currency) {
  }
}

3.7 アサーションを使ってコンストラクタ引数を検証する

メソッドの冒頭でのチェックをアサーションと呼ぶ。前提チェックともいう。

基本的にはアサーションライブラリを使って検証しましょう。

3.8 依存関係は注入せずに必要ならばメソッド引数として渡す

サービスは依存関係を持つことができるので、コンストラクタ引数として渡すのが良いが、、、
サービス以外では、値や値のリストを受け取るように留めること。

interface PasswordHasher {
  hash(password: string): string
}


class User {
  private name: string
  private hashedPassword: string

  constructor(name: string) {
    this.name = name
  }

  setPassword_Q(plainTextPassword: string) {
    this.hashedPassword = "" // ここでPasswordHasherサービスを使い、ハッシュ化したい。
  }

  setPassword_Ans(plainTextPassword: string, hasher: PasswordHasher) {
    this.hashedPassword = hasher.hash(plainTextPassword)
  }
}

Discussion