CCPとは?閉鎖性共通の原則を解説!

設計

閉鎖性共通の原則(CCP)とは?

閉鎖性共通の原則(CCP: Common Closure Principle)は、ソフトウェア設計における重要な原則の一つで、「変更の理由が同じクラスやモジュールをグループ化するべき」という考え方です。

簡単に言うと、「一緒に変更される可能性があるものは、1つのモジュールやパッケージにまとめるべき」というルールです。これにより、変更時の影響範囲を限定し、保守性を向上させます。

考えが生まれた背景

ソフトウェア開発の現場では、次のような課題が頻発していました

変更の影響が広がる

  • ある機能を変更すると、複数のモジュールやクラスにわたって修正が必要になることがあります。
  • これにより、変更のコストが増大し、予期せぬバグを生むリスクが高まります。

関連するコードが分散している

  • 同じ理由で変更されるはずのコードが異なる場所に分散していると、変更箇所を見つけるのが困難になります。
  • 修正漏れが発生する可能性が高くなり、保守性が低下します。

チーム開発の混乱

  • 関連する変更が複数の開発者にまたがる場合、変更内容の調整が難しくなり、開発効率が低下します。

閉鎖性共通の原則は、これらの課題を解決するために提唱されました。一緒に変更される可能性が高いコードを1つのモジュールやパッケージにまとめることで、変更時の影響を最小限に抑える設計を目指します。

CCPのメリット

変更の影響を最小化

  • 変更が必要なコードが1つのモジュールにまとめられていれば、変更箇所を特定しやすくなります。
  • 他のモジュールへの影響を最小限に抑えられるため、バグのリスクを軽減できます。

保守性が向上

  • 関連するコードが一箇所にまとまっているため、修正や機能追加が容易になります。
  • チーム内での変更内容の共有や調整がスムーズに進みます。

開発効率の向上

  • 関連する変更をまとめて行えるため、開発スピードが向上します。
  • 冗長なコードや複数箇所での同じ修正作業が不要になります。

具体的な例

NGな例:関連するコードが分散している場合

例えば、ECサイトの注文機能を考えます。以下のように、注文処理に関するロジックが複数のモジュールに分散しているとします。

  • OrderValidator:注文の検証を行うクラス
  • OrderProcessor:注文の処理を行うクラス
  • OrderNotifier:注文完了通知を送るクラス

もし、「注文にクーポンを適用するロジックを追加する」という要件が発生した場合、上記3つのクラスをそれぞれ修正しなければなりません。このような設計では、変更の影響が広がりやすくなります。

OKな例:関連するコードを1つのモジュールにまとめる

閉鎖性共通の原則を適用すると、以下のように設計を改善できます

Java
class OrderService {
    public void validateOrder() {
        // 注文の検証ロジック
    }

    public void processOrder() {
        // 注文の処理ロジック
    }

    public void sendOrderNotification() {
        // 注文完了通知のロジック
    }
}

この場合、注文にクーポン適用機能を追加したい場合は、OrderService クラスだけを修正すれば済みます。

CCPとSRP(単一責任の原則)の類似点

  • SRP(単一責任の原則)
    クラスやモジュールは「1つの責任」に集中すべき。1つの理由でしか変更されないように設計します。
単一責任の原則とは?初心者でも分かる簡単解説
単一責任の原則(SRP)を初心者向けに解説。背景や具体例、メリット、課題と対策を丁寧に説明し、実践をサポートします!
  • CCP(閉鎖性共通の原則)
    変更の理由が同じものを1つのモジュールにまとめるべき。

共通点
どちらも「変更」を中心に設計を考える点で共通しています。SRPは個々のクラスの責任範囲に焦点を当て、CCPは関連するクラスやモジュールのグループ化に焦点を当てています。

CCPの課題

適切な設計の判断が難しい

  • 「どのコードが同じ理由で変更されるのか」を見極めるのは簡単ではありません。
  • 設計の経験や変更履歴の分析が必要です。

モジュールの肥大化

  • 関連するコードを1つのモジュールにまとめすぎると、モジュールが大きくなり、管理が難しくなる可能性があります。

まとめ

閉鎖性共通の原則(CCP)は、「変更の理由が同じコードを1つのモジュールにまとめるべきという設計の基本原則です。これにより、変更時の影響範囲を限定し、保守性や開発効率を向上させることができます。

コメント

タイトルとURLをコピーしました