<< Bounded Context パターンの実践方法は? | main | ドメインモデルの継続的インテグレーション >>

凝集度を高める : クラスもパッケージもコンテキストも「ドメインの視点」で凝集すべし

ソフトウェアの設計の原則に、モジュール(ソフトウエアのかたまり)は

・凝集度 ( Cohesion )を高くすべし

というのがある。

凝集度


特定の関心事に密接に関係したものだけを集め、ひとつのかたまり「モジュール」にする。

その関心事と関係しないものは、別の「モジュール」に分別する。

そうすれば、

・読みやすく
・変更が容易で安全

になる。

いろいろな関心事が混ざってくるほど、読みにくく、変更がやっかいになる。

「モジュール」は、いろいろなスケールで存在する。

・クラス:データとロジックを集めた入れ物
・パッケージ:クラスを集めた入れ物
・コンテキスト:パッケージを集めたプロジェクトのコードベース

でも、凝集度の考え方もやり方もいっしょ。

どのレベルでも、

・それぞれの関心事ごとに、別の入れ物を用意する
・ひとつの入れ物には、その関心事に密接に関係した要素だけを集める
・それ以外は、別の入れ物にわける

これを、いつも気にすることが凝集度設計の基本。

設計スキルは同じもの


クラスの凝集度を高く設計できるチームは、パッケージ設計も、高い凝集度にこだわる。

そして、プロジェクトのコードベースという「コンテキスト」のレベルでも、凝集度を高くするメリットにこだわる。

あるいは、凝集度が低下して、いろいろな関心事がひとつの入れ物に混ざってくることに、いやな臭いを敏感に感じ取る。

クラスの凝集度に敏感であれば、コンテキストの凝集度にも敏感になる。

クラスの凝集度設計がずさんなチームは、パッケージやコンテキストの凝集度は、とんでもない状態になっちゃう。

「高凝集度」設計のスキルアップは、クラス設計から


最初は、誰でも初心者。
最初から良い設計なんてできないのが当たり前。

まずは、怪しい設計でも、とにかくクラスを設計して、コードにしてみる。
それを、リファクタリングしながら、凝集度にこだわった設計改善のやり方を覚えていく。

ファウラーの「リファクタリング」や、Domain-Driven Desing の 第III部 Refactoring Toword Deeper Insight は、こういうクラス設計レベルでの「凝集度」の設計改善のやり方やヒントが、いろいろ説明されている。

お薦めの練習課題は、何度も書いているように、「日付」とか「金額」を扱う、小型の気の利いた Value Object の設計・実装ですね。

・このクラスの「関心事」は何か?
・その関心事に密接に関係する要素を、もれなく集めたか?
・その関心事と切り離すべき要素は、きちんと分離できているか?

こういう視点で、クラスの設計を考え、見直すことを何回も繰り返す。


そうすると、だんだん、「凝集度」の高い設計のコツをつかめてくる。
そうなれば、パッケージの設計も、コンテキストの境界の決め方も、自然と洗練されてくる。

・このパッケージの関心事は何か?
・パッケージには、密接に関係するクラスだけを集めているか?
・そのパッケージの関心事と切り離すべきクラスが混ざっていないか?

という発想・議論ができるようになる。

そして、

・このコンテキストの関心事は何か?
・このコンテキストの関心事だけのパッケージを集めているか?
・このコンテキストから切り離すべき、関心事が混ざってきていないか?

という「コンテキスト」レベルの発想・議論が同じようにできるようになる。

クラスの凝集度の設計の検討ができるチームは、ごく自然に、コンテキストの凝集度の議論もできる(はず)。

凝集度は「ドメイン」の視点で


凝集度を高める、というのは、あらゆる分野のソフトウェア設計に共通する原理。

ドメイン駆動設計という文脈では「凝集度」は「ドメイン」の概念での凝集度である。

・ドメインの関心事は何か?
・ドメインの基本の構造は、どうなっているか?

という「ドメイン」の概念にそって、

・クラスの凝集度
・パッケージの凝集度
・コンテキストの凝集度

を高めることにこだわって設計とその改善をしていく。

ドメイン層のクラス名やパッケージ名は、「ドメイン」の概念(用語)だけに保つ。

ひとつのコードベース( = Bounded Context ) に、「目的と背景」が異なるドメインの概念(用語)を持ち込まない。

凝集度を高めるために、「ドメイン」の概念を切り口にして凝集・分離することが、ドメイン駆動設計の基本ですね。

それが、クラスの単位でも、コンテキストの単位でも、まったく同じ考え方だし、同じやり方でできるはず。

コメント
コメントする









この記事のトラックバックURL
トラックバック
calendar
  12345
6789101112
13141516171819
20212223242526
27282930   
<< September 2020 >>
システム設計日記を検索
プロフィール
リンク
システム開発日記(実装編)
有限会社 システム設計
twitter @masuda220
selected entries
recent comment
recent trackback
categories
archives
others
mobile
qrcode
powered
無料ブログ作成サービス JUGEM