1️⃣

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

2024/02/11に公開

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

3.9 名前月コンストラクタを使う

オブジェクト生成のための手段を複数用意できる。

class ID {
  private _value: string

  private constructor(v: string){
    if (!v) {
      throw new Error("err")
    }

    this._value = v
  } 

  static FromString(v: string): ID {
    return new ID(v)
  }
  static FromNumber(v: number): ID {
    if (v <= 0) { // この辺の検証はサンプルのため雑に書いている。
      throw new Error("err")
    }
    return new ID(String(v))
  }
}

ドメイン固有の名前で生成できる。

class ID_Generator {
  private _value: string

  private constructor(v: string){
    if (!v) {
      throw new Error("err")
    }

    this._value = v
  } 

  static generate() {
    const rand = "1" // 何かしらランダムに生成する
    return new ID_Generator(rand)
  }
}

3.10 プロパティフィラーを使用しない

オブジェクトの内部が公開されている例

class Position {
  private x : number
  private y : number

  constructor(x: number = 0, y: number = 0) {
    this.x = x
    this.y = y
  }

  public static fromArr(data: {'x': number, 'y': number}): Position {
    let position = new Position()
    position.x = data['x'] // ここでクラス内部にアクセスしてしまっている!!!!
    position.y = data['y'] // ここでクラス内部にアクセスしてしまっている!!!!
    return position
  }
}

Discussion