« 大規模制御システム向けオブジェクト指向開発手法HOOD | トップページ | 大不況の時代だからこそエンジニアの最高の教科書!!~書籍「建築家 安藤忠雄」 »

2009年1月21日 (水)

優れたアーキテクチャ設計の肝~原則集と連結度&凝縮度

堅牢性が高く、拡張性にも優れたアーキテクチャを設計するにはどうしたらいいか?という質問は常に尋ねられる。

確かにアーキテクチャ設計はいつでも難しい課題である。だからこそ俗人的な方法やあまり根拠のない方法ではなく、工学的なアプローチをとる必要がある。

具体的には、アーキテクチャ設計のときに

  • 「どのようにサブシステム分割すればいいのか?」
  • 「保守性、拡張性の優れたサブシステムであるか否かは何で判断されるのか?」

という質問となるだろう。

優れたアーキテクチャを設計する上では、いろいろなことを考慮しなければならないし、知識も必要となるが、オブジェクト指向や開発言語を一通り理解している場合は、

  • 非循環依存関係の原則(Acyclic Dependencies)
  • 閉鎖性共通の原則(Common Clouse)
  • 全再利用の原則(Common Reuse)
  • 単一責務の法則(The Single Responsibility Principle)
  • 「継承(汎化-特化)」関係クラス群同一パッケージの原則
  • 「全体-部分」関係クラス群同一パッケージの原則
  • 依存関係逆転の原則(The Dependency Inversion Principle)
  • オープン-クローズドの原則(The Open-Closed Principle)
  • 再利用・リリース等価の原則(Release-Reuse Equivalency)
  • 安定度・抽象度等価の原則(Stable Abstractions)
  • 安定依存の原則(Stable Dependencies)

を理解するといいだろう。

E・ガンマのデザインパターンなどは有名で理解している方も多いと思う。ただし、優れたアーキテクチャを設計するには不可欠な知識ではあるが、少しばかり粒度が細かいテクニックなので、それ以前にサブシステムやコンポーネントをどのように分割するかという点を知っておかなければならない。

上記の原則群はあやふやな部分がないくらい完璧に理解しておかなければいけない。
どのような分野のシステムでも、どのような開発言語で実装する場合でも、不可欠な内容で非常に有効だ

これらの原則を理解していくと、面白い事に気づくと思う。原則間で一見矛盾しているように思えるものが存在する。

例えば、「継承(汎化-特化)関係クラス群同一パッケージの原則」と「依存関係逆転の原則」などがそうだ。

しかし、これは依存関係逆転の原則が、「継承(汎化-特化)関係クラス群同一パッケージの原則」を逆手にとって、依存関係を逆転させているテクニックであることに気づくだろう。

実はE・ガンマのデザインパターンとこれらの原則を併用するともの凄く保守性や拡張性が高いアーキテクチャ設計が可能になる。
優れたアーキテクチャはこれらのことを踏まえた設計がされていることが、一目瞭然で読み取れるようになる。

優れたアーキテクチャを設計するには、まだ知っておくべきどうしても外せない事がある。それは、サブシステムやコンポーネントの内部の凝縮度と依存関係である連結度を意識しなければならないことである。

実は、優れたアーキテクチャを実現する上で、サブシステムやコンポーネントの内部の凝縮度と依存関係である連結度が非常に重要になってくる。

先ほどの原則は、優れた凝縮度と連結度を実現するためのテクニックの原則なのだ。

凝縮度と連結度は昔から有名で、G.J. マイヤーズが「ソフトウェアの複合/構造化設計」という書籍で解説している。私も自分の書籍の中で解説している。

このサブシステムやコンポーネントの内部と依存関係に注目して先ほどの原則を整理すると

パッケージ内部の凝集度(Cohesion)

  • 再利用・リリース等値の原則(REP:Reuse-Release Equivalency Principle)
  • 全再利用の原則(CRP:Common Reuse Principle)
  • 閉鎖性共通の原則(CCP:Common Closure Principle)

パッケージ同士の結合度(Coupling)

  • 非循環依存関係の原則(ADP:AcyclicDependenciesPrinciple)
  • 安定依存の原則(SDP:StableDependencies)
  • 安定度・抽象度等価の原則(SAP:StableAbstractionsPrinciple)

となる。

残念なことに開発現場のエンジニアにはあまり知られていないようだ。

これらの原則と連結度と凝縮度を理解してもらう時に、私はコンサルテーションやトレーニングの中で、具体的なクラス図とサブシステム(あるいはコンポーネント)間の依存関係を具体的に示して解説している。

オブジェクト指向の基礎があり、アーキテクチャ設計に携わっていて問題意識があるなら、具体的な例を示すので、1時間~2時間程度の講義で理解してもらえる。

連結度と凝縮度を確実に理解し、設計に取り込まなければコンポーネントの部品化や再利用そして、優れたアーキテクチャ設計は困難と考えた方が良い。ザルで水を汲むようなことに成りかねない。

それくらいこれらの原則と連結度と凝縮度の理解は重要である。

=HSCI Takanari Hashimoto(URL:http://hsc-i.com/)=

|

« 大規模制御システム向けオブジェクト指向開発手法HOOD | トップページ | 大不況の時代だからこそエンジニアの最高の教科書!!~書籍「建築家 安藤忠雄」 »

「パソコン・インターネット」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/112989/43810022

この記事へのトラックバック一覧です: 優れたアーキテクチャ設計の肝~原則集と連結度&凝縮度:

« 大規模制御システム向けオブジェクト指向開発手法HOOD | トップページ | 大不況の時代だからこそエンジニアの最高の教科書!!~書籍「建築家 安藤忠雄」 »