🕘

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

2024/02/29に公開

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

6.3 内部状態を公開するようなクエリメソッドは避ける

オブジェクトが表す概念の知識をオブジェクト内に留めるようにしよう。

クライアントに判断させないこと。

NG

class Product {
  shouldDiscountPercentageBeApplied(): boolean {
    // 略
  }
  
  discountPercentage(): Percentage {
    // 略
  }

  fixedDiscountAmount(): Percentage {
    // 略
  }
}

const product = new Product()
const amount = new Money()
if (product.shouldDiscountPercentageBeApplied()) {
  newAmount = product.discountPercentage().applyTo(amount)
} else {
  newAmount = amount.subtract(product.fixedDiscountAmount())
}

OK

class Product {
  private shouldDiscountPercentageBeApplied(): boolean {
    // 略
  }
  
  private discountPercentage(): Percentage {
    // 略
  }

  private fixedDiscountAmount(): Percentage {
    // 略
  }

  caluculateNetAmount(): Money {
    if (this.shouldDiscountPercentageBeApplied()) {
      return this.discountPercentage().applyTo(amount)
    }
    return amount.subtract(this.fixedDiscountAmount())
  }
}

const product = new Product()
const amount = new Money()
const newAmount = product.caluculateNetAmount(amount)

さまざまな呼び出し元でロジックの繰り返しが不要になる。
不必要に内部データを公開しないで良くなる。

Discussion