📝

要約:「クラス設計の鉄則」-雑誌『Software Design 2025年5月号

に公開

記事の概要

この記事は
雑誌『Software Design 2025年5月号』
https://gihyo.jp/magazine/SD/archive/2025/202505
第2特集 もう一度学び直す クラス設計の鉄則 堅牢で変更に強いコードを作り上げる技術
の要約になります。

第1章 クラス設計再入門

クラス設計の基本は、以下の3つを意識する。

  • モジュール性
  • 関心の分離
  • 依存関係

1. モジュール性

システムを独立性の高い部品(クラス)に分割し、役割や接続方法を明確にすること。単なるクラス分割ではなく、役割や関係が明確でなければ「大きな泥団子」になりやすい。

2. 関心の分離

1つのクラスが1つの関心事だけを扱うこと。とくに「計算判断」と「入出力」を分離し、金額や数量など業務独自のデータ型をクラスで表現することで、ロジックの重複や分散を防ぐ。

可視性(public, privateなど)を適切に使い、必要なものだけを公開する。publicが多い場合は関心の分離が不十分なサイン。

3. 依存関係

暗黙的な依存(重複や分散)を防ぎ、明示的な依存(参照関係)はシンプルに保つ。依存関係が多い・不安定な場合は設計改善が必要。

アプリケーション独自のデータ型を早い段階でクラス化し、ロジックの仮置き場として活用することで、設計改善のヒントが集まる。

第2章 迷わないクラス設計の指針

アプリケーションの関心事を

  • 計算判断
  • アプリケーションサービス
  • プレゼンテーション
  • データソース

の4つに分けて設計するのが現代的なアーキテクチャの基本。

「計算判断」→「アプリケーションサービス」→「プレゼンテーション/データソース」の順で設計し、依存される側から順に設計する。

1. 計算判断クラス

業務ルールや計算ロジックを担当し、アプリケーション独自のデータ型を不変(イミュータブル)で設計する。

2. アプリケーションサービスクラス

ユースケースや機能の流れを担当し、詳細な処理は他のクラスに委譲する。interfaceを活用して依存を分離する。

3. プレゼンテーションクラス

外部からのリクエスト受付や入出力変換を担当し、アプリケーションサービスクラスと疎結合にする。

4. データソースクラス

DBや外部APIとのやりとり・モデル変換を担当し、実装とinterfaceを分離する。

現代的な設計指針

現代的な設計指針として、「可変より不変」「エンティティより値」「継承よりコンポジション・サブタイピング」を重視する。これにより、変更に強く保守しやすい設計になる。

第3章 設計の落とし穴対策

  • ソフトウェアは時間とともに設計が劣化するため、継続的な改善が重要。
  • コードの整頓として「実行されないコードの削除」「小さく分ける(空白行やクラス分割)」「順番を整える(メソッドやif文の位置)」「コードで説明する(意味ある変数名や定数)」を実践する。
  • 長いメソッドや大きなクラス、データだけ/ロジックだけのクラスは、関心の分離やモジュール性の観点から分割・再設計の候補。
  • インスタンス変数や依存関係(import文など)に注目し、グループ化して新しいクラスに切り出すことで設計を改善できる。
  • 良い設計は、実際に手を動かしてリファクタリングや分割を繰り返し、体験的に学ぶことが大切。設計の「感覚」を養うことが、より良いクラス設計につながる。

自分向けまとめ

要約に入っていない内容もありますが、自分に向けてのまとめ

  • クラスは小さく
  • 関連するデータとロジックを1つのクラスに
    • データだけのクラス、ロジックだけのクラスも作らない
  • アプリケーション独自のデータ型を作る
  • publicを使う箇所が増えてきたら、関心の分離がうまくいっていない
  • 計算判断クラス、アプリケーションサービスクラス、プレゼンテーションクラスおよびデータソースクラスの順で設計
    • 計算判断クラスの設計
      • アプリケーション独自のデータ型クラス
      • アプリケーションに必要な計算判断の結果を表現するクラス
      • 内部のインスタンス変数の状態を変更しない、不変なクラス
  • 使わないコードは削除する
  • 小さく分ける方法
    • まずは空白行で分ける
    • 空白行で分けたら、クラスに分けられるか検討
  • メソッドの定義の順番
    • 似た機能は近くに置く
    • 重要な機能は前に持ってくる
  • コードに意味を持たせる。コメントで説明しようとしない

Discussion