kiyomitsu blog

Software Tech Blog

ソフトウェア開発における結合性・凝集性とは?

今回は、「Adaptive Code ~ C#実践開発手法 第2版」より、適応性のあるコードを書くための、ものの見方の一つである、結合性と凝集性について学んだので、共有したいと思います。

※ ここでいう、適応性のあるコードとは、「ソフトウェアの機能追加や修正等が必要になっても、柔軟に対応できるコード」のことを指します。

適応性のあるコードと結合性・凝集性の関係は?

適応性のあるコードは、コード全体の結合性の弱さ(低さ)凝集性の強さ(高さ)という利点の上に成り立っています。

そのため、結合性と凝集性を意識しながらコードを書いていけば、コードは適応性を持つことができます。

f:id:kiyomitsu0726:20201011113235p:plain
適応性は、結合性の弱さと凝集性の強さの上に成り立っている

結合性

ソフトウェア開発における結合性とは、「ソフトウェア要素間の相互依存性の強さ」を指します。

※「ソフトウェア要素」というのは、メソッド、クラス、コンポーネント等のさまざまなソフトウェアの構成要素のことを示します。

結合性の程度は、「強い(高い)・弱い(低い)」という形で表すことができ、「弱い(低い)」方が望ましいです。

なぜ、結合性は弱い方がいいの?

「結合性が強い」とは、ソフトウェア要素間の相互依存性が強く、コードを修正・追加する度に、他の部分にも影響が出やすい状態を指します。そのため、コード内容の理解が難しかったり、バグを生みやすくなってしまいます。

「結合性が弱い」とは、ソフトウェア要素間の相互依存性が弱く、コードを修正・追加しても、他の部分にも影響が出にくい状態を指します。つまり、それぞれのソフトウェア要素が独立している状態(あるいはそれに近い状態)にあるので、コードの内容が理解しやすく、バグも生みにくくなります。

そのため、「結合性が弱い」方が望ましいのです。

凝集性

ソフトウェア開発における凝集性とは、「ソフトウェア要素間の関連性・共通性の強さ」を指します。

※ここでは「関連性」や「共通性」を、ある目的を果たすために必要なものかどうか、と定義します。ある要素間の関連性・共通性が強いと、目的のあるコードを書けていることになり、逆に弱いと、目的の見えないカオスなコードを書いていることになります。

凝集性の程度は、「強い(高い)・弱い(低い)」という形で表すことができ、「強い(高い)」方が望ましいです(結合性とは逆ですね!)

なぜ、凝集性は強い方がいいの?

「凝集性が強い」とは、ソフトウェア要素間の関連性・共通性が強く、互いに関連する機能や情報が局所化している(閉じている)状態を指します。そのため、コードの内容が理解しやすくなり、コードの拡張・保守がしやすくなります。

「凝集性が弱い」とは、ソフトウェア要素間の関連性・共通性が弱く、関連する機能や情報が分散している状態を指します。そのため、コードの目的を理解できず、コードの拡張・保守が難しくなってしまいます。

身近な例でいうと、「図書館の本棚」が当てはまるかと思います。

図書館の本棚は、「化学」や「日本文学」等というカテゴリで数多くの書籍を分類し、カテゴリ毎に一か所に整理されています。 これは、カテゴリ分けして、ある関連性・共通性を持った形で整理整頓されているため、「凝集性が強い」と言えるのではないかと思います。 この状態だと、どの分野の書籍がどこにあるのかさえ知っていれば、短時間で、目的の書籍を探すことができます。

反対に、「凝集性が弱い」状態にすると、どうなるでしょうか? カテゴリ分けせずに、あらゆる分野の書籍が混ざったカオスな状態となりますので、おそらく、ある一冊を探すのに、全く見当も付かず、図書館全体を探すことになるかと思います。

だからこそ、「凝集性は強い」方が望ましいわけです。

結合性と凝集性の関係

結合性と凝集性には、適応性のあるコードを書く上で、関係し合っています。

前述しましたが、結合性も凝集性も、どちらも意識することで、コード内容が理解しやすくなり、コードの拡張・保守がしやすくなります。

また、例えば、凝集性が強いと、関連機能や情報が局所化して閉じた状態となるため、各要素が独立した状態に近づくので、結合性も弱くなる傾向があります。そのため、凝集性を意識すれば、ある程度、結合性も改善されることになります。

結合性と凝集性は以下のようなマトリクスで表すことができます。

f:id:kiyomitsu0726:20201011130344p:plain
強い凝集性と弱い結合性を目指そう!

まとめ

結合性と凝集性は、適応性のあるコードを書く上で、重要な考え方であるということを共有しました。

ただ、結合性・凝集性とはどういうものなのか?、で終わりましたので、近いうちに、自分なりの実践方法というものを共有できたらと考えています。

参考図書・サイト

ToDo

  • コード例を追加
  • 結合性が強い・弱いときの身近な例を追加。図を盛り込む。
  • 凝集性が強い・弱い時の身近な例を追加。図を盛り込む。