COLUMN

第4回【IT技術系コラム】オブジェクト指向設計原則-(3)パッケージ結合度に関する原則

オブジェクト指向設計原則-(3)パッケージ結合度に関する原則

今回は、パッケージ結合度(パッケージ間の参照・依存関係等)について取り上げたいと思います。

前回同様、Robert C. Martin氏が設立したObject Mentor社(http://www.objectmentor.com/)において、これらのアイデアの原文が公開されていますので、ご興味のある方はご一読ください。 (Resources→Published Articlesページ
また、書籍(翻訳和書)として下記が出版されており、まとめられています。

今回はこのうち、「パッケージ結合度に関する原則」を取り上げます。

  1. 5つのクラス設計に関する原則(略)
  2. 3つのパッケージ凝集度に関する原則(略)
  3. 3つのパッケージ結合度に関する原則
    1. 非循環依存関係の原則(ADP: The Acyclic Dependencies Principle)
    2. 安定依存の原則(SDP: The Stable Dependencies Principle)
    3. 安定度・抽象度等価の原則(SAP: The Stable Abstractions Principle)
  4. 3つのパッケージ結合度に関する原則(略)

3.a 非循環依存関係の原則(ADP)
THE DEPENDENCY STRUCTURE BETWEEN PACKAGES MUST BE A DIRECTED ACYCLIC GRAPH (DAG). THAT IS, THERE MUST BE NO CYCLES IN THE DEPENDENCY STRUCTURE.
パッケージ間の依存構造は無閉路有向グラフ(DAG)でなければならない。つまり、依存構造に循環があってはならない。
  • ソフトウェア開発の現場で、伝統的に「ウィークリービルド」という手法(ないしそれに準じた手法)が取られることがあります。 つまり、例えば週5日のうち4日は純粋に開発期間にあて、1日は開発成果の統合(マージ/ビルド)の期間に充てる、という考え方です。 しかし、プロジェクトが大規模化するにつれて、全体に占める統合作業の時間が長くなり、非効率さが発生することになります。
  • さらに、テストが困難になったり、ユーザーレビュー・フィードバックの機会を失うなど、非効率さによるソフトウェアの品質低下も引き起こすでしょう。
  • こういったリスクを予防するために、ソフトウェアのリリース単位、つまりパッケージの相互関係をクリーンな状態に保つことが非常に重要です。つまり、開発環境をリリース可能なパッケージに分割し、パッケージ間の依存関係に循環が生じないようにする、という努力です。
  • 一般的なオブジェクト指向開発環境において、相互(循環)依存するようなパッケージ関係は簡単に構築できてしまうので注意が必要です。一般的な循環関係の解決策として、以下の2つが例示されています。
    • 循環解消策1:依存関係逆転の原則(DIP)によるインタフェースの介入
    • 循環解消策2:相互に依存しあうクラスのみをまとめた、第3の中継パッケージの導入
3.b 安定依存の原則(SDP)
THE DEPENDENCIES BETWEEN PACKAGES IN A DESIGN SHOULD BE IN THE DIRECTION OF THE STABILITY OF THE PACKAGES. A PACKAGE SHOULD ONLY DEPEND UPON PACKAGES THAT ARE MORE STABLE THAT IT IS.
パッケージ間の依存は安定したパッケージの方向に依存するべきである。パッケージはより安定したパッケージのみに依存するべきである。
  • 一般的に、ソフトウェアの設計を当初で完全に固定することは不可能で、設計を保守するためには不安定さ・変更を前提としたパッケージが存在すると考えられます。(不安定なパッケージの前提。当初設計を固定したいという理想と現実のギャップは、ソフトウェア開発者であれば誰しも感じるところだと思います。)
  • そこで、システム全体が外部からの変更要求に対して柔軟に対応可能であるためには、不安定なパッケージが安定したパッケージに依存するように設計する必要がある、としています。
  • 「不安定性の尺度」として、単純な数式が定義されています。
    • Ca(内向きの結合度)=パッケージ外からパッケージ内のクラスに依存するクラスの数
    • Ce(外向きの結合度)=パッケージ内からパッケージ外のクラスに依存するクラスの数
    • I(不安定度[0,1])=Ce/(Ca+Ce)
    • Iがより大きいパッケージが、Iがより小さいパッケージに依存する関係。
3.c 安定度・抽象度等価の原則(SAP)
PACKAGES THAT ARE MAXIMALLY STABLE SHOULD BE MAXIMALLY ABSTRACT. INSTABLE PACKAGES SHOULD BE CONCRETE. THE ABSTRACTION OF A PACKAGE SHOULD BE IN PROPORTION TO ITS STABILITY.
最も安定したパッケージは最も抽象的なパッケージである。不安定なパッケージは具体的である。パッケージの抽象度と安定度は同程度でなければならない。
  • 「安定依存の原則(SDP)+安定度・抽象度等価の原則(SAP)=パッケージ版の依存関係逆転の原則(DIP)」であるとしています。つまり、依存関係は具体的で不安定なパッケージから、抽象的で安定的なパッケージに向かうことになります。
  • 「抽象度の尺度」として、単純な数式が定義されています。
    • Nc=パッケージ内のクラスの数
    • Na=パッケージ内の抽象クラスの数
    • A(抽象度[0,1])=Na/Nc
    • 縦軸に「抽象度」、横軸に上記の「不安定度」をとり、両社を概念的ないし実例として関係づけることが出来ます。苦痛ゾーン(0,0付近)。無益ゾーン(1,1付近)。
    • (0,0)付近は非常に具体的で安定しており、変更するのが困難(苦痛を伴う)、従って上手に設計されたパッケージはこの近傍に発見されることはないとして、これらのゾーンを「苦痛ゾーン」としています。
    • (1,1)付近は非常に抽象的で不安定な状態(自パッケージを利用する他パッケージがない)、従ってこのパッケージは有益性に乏しく、これらのゾーンを「無益ゾーン」としています。
    • (0,0),(1,1)近傍は極端なゾーンとして除外され、通常のパッケージはその中間に位置していると考えられます。開発者が感覚的にこういったゾーンをイメージしながら初期のパッケージ定義を行うことは、機動的な開発を行う上で非常に重要であると考えます。

今回を含む3回にわたり、オブジェクト指向設計原則として、5つの「クラス設計の原則」、3つの「パッケージ凝集度に関する原則」、3つの「パッケージ結合度に関する原則」を取り上げました。
先立つ賢人におまとめいただいたこの種の原理原則は汎用的に当てはまる知恵、ルールであると思います。個別詳細・具体的なルール、工夫は実際の開発作業の中で発見され、遵守されるものだと思いますが、自らが詳細・具体的なルールを定義しなくてはならなくなったとき、こういった既に明文化された原理原則は非常に役に立つと痛感するところです。
優れたアイデアを公開し開発プロセスの質の向上に大きく貢献されている冒頭諸氏に敬意を表するとともに、読者の皆様のアイデアの一助となれば幸いです。

 

 

プライマル株式会社|コンサルティング事業部


Warning: include(/home/1806248425/primal-inc-com/public_html/common/inc/main_inquiry.html) [function.include]: failed to open stream: No such file or directory in /home/1806248425/primal-inc-com/public_html/column/entry/article000086.php on line 200

Warning: include(/home/1806248425/primal-inc-com/public_html/common/inc/main_inquiry.html) [function.include]: failed to open stream: No such file or directory in /home/1806248425/primal-inc-com/public_html/column/entry/article000086.php on line 200

Warning: include() [function.include]: Failed opening '/home/1806248425/primal-inc-com/public_html/common/inc/main_inquiry.html' for inclusion (include_path='.:/usr/share/pear:/usr/share/php') in /home/1806248425/primal-inc-com/public_html/column/entry/article000086.php on line 200