凝集度が高いって何?何が良いの?
#cleancode
凝集度とは?(モジュール強度とも言う)
同じモジュール内に割り振られた機能間の関係が強度である
つまり、同じモジュール内に収容された複数の機能間の関係の強さを表したものが強度
凝集度を高める : クラスもパッケージもコンテキストも「ドメインの視点」で凝集すべし
・それぞれの関心事ごとに、別の入れ物を用意する
・ひとつの入れ物には、その関心事に密接に関係した要素だけを集める
・それ以外は、別の入れ物にわける
結合度と凝集度
凝集度が高い = ある責務・関心ごとが1か所に集約されている
凝集度が低い = ある責務・関心ごとが色んな箇所に点在している or 1か所に色んな責務・関心が混在している
ある事柄に関する処理やデータが複数の箇所に点在していると,どのように処理によって実現されているのか把握するのが難しくなりますし,変更しようと思ったときに修正するべき箇所が多くなります。
システムはシンプルに保つ
凝集度は高くする(関係の深いものはまとめる)
結合度は低くする(関係のないものには依存しない)
凝集しているとは
ある関心事に対して密接に関係した要素だけが集まってることを指す
なぜ凝集度を高める必要があるのか?
そもそも凝集度が低いとは
1つの関心事を示すための部品が色んな場所に散らばってる状態
低凝集で起こる弊害
1. 1つの機能変更に対して、様々な箇所を変更することになる
変更する箇所の漏れが出てきて、開発スピードが下がったり、バグが起きたりする
2. 1つの関心事の実現方法を把握するのが難しくなる
ここも開発スピードが下がる要因になる
3. 様々な関心事を詰め込んでると、1つの変更影響が他にも及び可能性が高くなる
別々の関心事が同じ部屋の中にあると、別々なはずなのに思わぬ絡み方をしてバグを生みやすくなる
その他メリットを理解しやすい文章
高凝集性と低結合性で、スケールする組織をつくる
https://scrapbox.io/files/63387e50159a63001d89ebb1.png
凝集性を高めることで、構成要素の依存関係(コミュニケーションパス)が整理されると共に、全体の構造の認知が容易になります。明らかに、右の図のほうが構造を認識しやすいですよね。
従って、構成要素1つ1つの凝集性が高く、構成要素間が低結合な場合、
- 構成要素を塊として認識できる
- 構成要素間の依存関係が最小化される
ということが実現され、ソフトウェアの構造を理解する認知負荷が劇的に下がります。
これにより、エラー率の低下、エラー時の復旧スピードの早さ、構成要素をまたぐプログラム構築の容易さ、などが担保され、大規模化しつつ、アウトプットが増え続けるソフトウェアが実現されます。
凝集度の測り方
https://www.itmedia.co.jp/im/articles/0510/07/news106.html
感想onigiri.w2.icon
その集まりの役割が綺麗に一言で表せる状態なら「高凝集」と言える。
どの粒度に置いても「この集まりはこれ」て言える状態にしておきたい。
「この集まりはこれもしてあれもして」だと凝集とは言えない。
システムは...
小さな役割を持った部品の集まりが、更に大きな塊になるねんけど、その大きな塊にも役割があってつぎの塊を作る要素になり...をただ繰り返してるだけ
その塊たちは1つの役割を持ってるだけでいい、そうするために「高凝集」を意識しろってこと
高い凝集にしないと、保守が低いシステムがたちまち出来上がるんだよ