凝集と結合の違い
凝集と結合の違い
ソフトウェア開発における、以下の概念についての解説と分析をしますmiyamonz.icon
凝集、凝集度
結合、結合度
凝集
要素がどういう理由でまとまっているかを指す概念
要素の単位の粒度は、その時々で異なる
プログラムの行
変数、関数
ファイル
クラスのメンバやメソッド
一般的に、凝集度というと、行、処理のまとまりについて述べられる
論理的凝集とかのやつ
それ以外は、そのプログラミング言語の一般的な方法に基づく
ファイルとかクラスのメンバとか
なので、あまりこのレベルで凝集の仕方は分析されない気がする
特定の関数の引数がどのようなインターフェースであるべきか、といった程度
結合
要素同士がどのように繋がっているのかを指す概念
やりとりの内容に基づいて、良し悪しを判断する
要素の粒度は、ある程度大きい
クラス以上
なぜなら、それより小さいものは、
どの用に呼び出すかは自明であることが多い
型やインターフェースの問題として認識される
英単語のそのままの意味、イメージで捉えればいいのだが、一周回って難しく感じてしまうことがある
単語自体は異なるのに、なんだか似ている
miyamonz.iconはこう考えて整理してる
どちらの概念も「何らかの要素の集合」に対する評価指標である
異なる部分は
「要素」と「それらの集合」のスコープが異なる
スコープが異なるゆえに、指標の基準が異なる
cohesion 凝集
why, 理由に着目している
ここでは要素とその集合は、以下のようなものが想定される
table:a
要素 要素の集合
行 関数
関数や変数 1ファイル、1モジュール
ファイル フォルダ
メソッド、メンバ クラス
要素が集まって「凝集」しているわけだが
その集まりがなぜ、そのように集まっているのか、という点を評価している
コードを書き進めていると、自然となんらかのまとまりが生まれる
しかし、無意識に、自然にくっついたソレは、必ずしも良いくっつき方とは限らない
それを意識的に剥がして、良いまとまりを作る必要がある
その判断のために、良い凝集、という基準を考えて、分析している
coupling 結合
how, やり方に着目している
要素間の繋がり方に着目している
table:pattern
要素 要素の集合
関数やオブジェクト ←のまとまり(ファイル内だったり、またいだり
なんらかのモジュール アプリケーション全体
小さいモジュール 大きいモジュール
アプリケーション以外にも以下が考えられる
特定の目的を達成するシステム、フレームワーク、ライブラリ…
どのように通信しているか(how)を分析する
そうすることで、よりよい繋がり方を目指す
ボトムアップに考えたり、リファクタリングを行う場合、まず凝集を考えることが多いと思う
ただし、全体のモジュールの関係性を見て考えることは最初に行うこともできる。
その場合は結合について考えることになる
例えば
全体のモジュールの関係性を考えて、現状どのように結合してるかを観測して
その上で、どこから手を付けたら良いかを判断する
その結果、特定のモジュール内を更に掘り下げる
特定のモジュール内をトップダウンに分析するか
そのモジュール内の凝集に着目して改善していくか
…
凝集が良くなれば勝手に結合も良くなったり、逆も同様
だが、概念としては別