little hands' lab

ドメイン駆動設計、アジャイルプラクティスを実践し、解説しています。

設計/コードレビューで"常に"心がけるポイント

株式会社ログラスの松岡(@little_hand_s)です。

little-hands.hatenablog.com

↑の記事でドメインオブジェクトの設計方針を書きましたが、それ以外の全般的な設計/レビュー観点について書きます。
非常に汎用性のある内容なので、数多くのプログラミング原則を覚えるより、まずこの観点でチェックできるようにすると即効性が期待できます。

前提として、階層化されたアーキテクチャ(オニオンアーキテクチャなど)を採用しているものとします。

①レイヤーの責務違反の実装をしていないか

例として、「ユースケース層にドメイン層のルール/制約に関わる実装をしている」場合はNGです。

これが最も大切です。レイヤーの責務さえ守れていれば、あとは問題があっても狭い範囲でのリファクタで済みます。

各レイヤーの責務

  • ドメイン層:
  • ユースケース層:
    • ドメイン層でpublicなメソッドを組み合わせ、ユースケースを実現する
  • プレゼンテーション層:
    • クライアントに提供する入出力を定義する
    • クライアントとユースケースの間の情報を変換する
  • インフラ層:
    • ドメイン層、ユースケース層に定義されたIFを具体的に実現する

②高凝集/低結合になっているか

高凝集

クラスに関して
  • クラスの責務(何をする/何を表すクラスか)が明確か
  • クラスの責務と、保持する属性、メソッドの関連が強い(=高凝集)か
メソッドに関して
  • メソッドの責務(何をするメソッドか)が明確か
  • 意図が明白なインターフェイスになっているか
    • メソッド名:
      • 責務にあったメソッド名になっているか
      • 何が行われるのかがメソッド名から推測できるか、 誤解を生まないか
    • メソッド引数:
      • 何が渡されてくるか、呼び元を追わなくても理解できるか

悪い例(サンプルコードはKotlinです)

fun createUsers(
  // どのような値が渡されるのか、呼び元を追わないとわからない
  values: List<Triple<String, String, Int>>  
)

良い例

data class CreateUserParam(
  val name: UserName, 
  val emailAddress: EmailAddress,
  val age:Int
)

fun createUsers(
  // どんな値が来るのかがこの引数を見れば推測できる
  params: List<CreateUserParam>
)
  • 意図が明白なインターフェイスになっているか
    • メソッド戻り値:
      • 何が返されるか、メソッド内を追わなくても理解できるか

悪い例

// 何が返されるかメソッド内を見ないと理解できない
fun fetchUesrNames(): List<Pair<String, String>>

良い例

data class UseNameDto(
  val id: UserId, 
  val userName: UserName,
)

// 何が返されるかこのクラスだけ見ればわかる
fun fetchUesrNames(): List<UseNameDto>   

低結合

  • 行いたい処理がその少ないクラスで完結できるか
    • 悪い状態:
      10クラスぐらい追わないとどういう処理が行われるか理解できない

③ユニットテストを書きやすいか

高凝集/低結合だと自然とユニットテストテストが書きやすくなります。
逆に、ユニットテストが書きやすいかを考えると高凝集/低結合になっていない実装に気づくことができます。ユニットテストを書こうとしたときに、多くのクラスを組み合わせないとテスト観点が意味をなさないような場合は設計に問題がある可能性があるので、設計自体を疑ってリファクタを検討します。

合言葉

「責務!テスト!責務!テスト!」です。笑
本当に僕は職場でずっとこれを言っています。

冒頭でも書いた通り非常に汎用性のある原則なので、プログラミングの原則が多くてどれから覚えたらいいかわからないよ!という方も、まずは「責務!テスト!」と唱えて意識することをお勧めします。

筆者執筆書籍

初めてDDDを学ぶ方、もしくは実際に着手して難しさにぶつかっている方向けの書籍です。 迷子になりがちな「DDDの目的」や「モデル」の解説からはじめ、具体的なモデリングを行い実装まで落とす事例を元に、DDDの魅力や効果を体感することを目指します。

little-hands.booth.pm

本書はDDDの重要トピック「モデリング」「集約」「テスト」について詳細に解説し、その他のトピックでは頻出の質問への回答と具体的なサンプルコードをふんだんに盛り込みました。現場で実践して、困っていることがある方はぜひこちらもご覧ください。

little-hands.booth.pm