コード設計 プログラミング

【コード設計】プログラミングで必要な凝集度とは?

今回はコード設計で重要視される凝集度について具体的に説明していきます。

記事の目的

理解したつもりの凝集度をわかりやすく説明する

記事の信頼性

  • 参考文献がCyber AgentグループのCTOで、結構バズってたやつです
  • 執筆者はエンジニアです

凝集度とは

凝集度とは「モジュール内の協調度」を意味します。

モジュールとは「機能をもった一塊のコード」のことです。機能とは、「足し算をする」とか「テキストを表示をする」という命令を表すコードです。これらのコードの集まりの協調性を比較できるように作った指標が凝集度です。

そして凝集度には7つの種類があります。ここでは森さんの資料を抜粋させていただきます。

凝集度

上の図で示すように、凝集度が「低い」と、「悪い」コードとみなされ、「高い」と「良い」コードとみなされます。

偶発的凝集

偶発的凝集とは「ロジックがないままコードが集められた状態」を意味します。とにかく動かすためにコードを並べたもので、初めてプログラミングをするときに書きがちなコードです。

その例をコード上で表すと次のようになります。

最初に整数の宣言、次にコンソールに出力、合計の計算、Studentクラスのインスタンスを代入と「順序に何のロジックもない」状態です。これだと可読性、保守性が悪く、良いコードとは言えません。

なぜそうしたかが第三者でもわかるように、できるだけ機能を細分化して処理を完結にする必要があります。

偶発的凝集とは「ロジックがないままコードが集められた状態」を意味します。

凝集度は1番低く、もっとも避けるべきコードとされています。

論理的凝集とは

論理的凝集とは「Switchやif-elseなどの分岐処理の際、論理的に似た処理を並列させた状態」を意味します。

その例をコードで表すと次のようになります。

colorはEnum型の変数とします。switchの分岐条件をcolorとし、それぞれの分岐先で「果物の文字列」を返しています。

このコードの問題点は、2つあります。

1つ目は、3つの中に全く使わない処理がある可能性があることです。レモンの絵が極端に少ない場合など、レモンの処理数は少なくなり、caseの行で、無駄な処理判定が行われます。

2つ目は、処理の中身を意識して、フラグを渡す必要があることです。上記のコードの場合は、「紫の果物を返す」という処理を暗に理解してなければなりません。

凝集度は2番目に低いです。

時間的凝集とは

時間的凝集とは「時間的に意味を持ったコードが並べられた状態」を意味します。

その例をコードで表すと次のようになります。

何かの初期化やコネクションの確立など時間的なつながりがあります。

しかし、処理内容での関係性は薄いし、関数内の順番は関係なかったりします。

凝集度は3番目に低いです。

手順的凝集とは

手順的凝集とは「順番に意味を持ったコードが並べられた状態」を意味します。

その例をコードで表すと次のようになります。

コードの順番に意味があります。図では、文字を数字にしてから分岐処理を行う必要があり、その行にそのコードがある理由は明確です。

通信的凝集とは

通信的凝集とは「順番に意味があり、同じデータを引数として持つメソッドを並べた状態」を意味します。

その例をコードで表すと次のようになります。

setData関数内で使われる関数の引数はすべてdataとなっています。また、それぞれのメソッドの順番には意味があります。

逐次的凝集とは

逐次的凝集とは「あるデータの出力と入力に関する処理がまとめられた状態」を意味します。

その例をコードで表すと次のようになります。

dataという変数を一貫して扱っているため通信的といえます。また、データを入力、変換、出力という点が手順的とも言えます。

このコード設計は機能が独立していて良いコード例となります。

機能的凝集とは

機能的凝集とは「単一機能を実装した状態」を意味します。

凝集度の中では一番良いコード設計とされる

まとめ

今回はサイバーのCTO森さんのプレゼンを読み、非常にしっくりきたので自分でも文章にしました。

読んでいただきありがとうございました。

-コード設計, プログラミング
-

Copyright© SugLog , 2021 All Rights Reserved Powered by AFFINGER5.