凝集度
「ここで用意したユーザにツイートの情報を加えるんだ。ツイートはTwitterからとってくる。Twitterからデータを取得する方法は込み入っていてね、まず…(中略)…取得できたね。そうしたらデータをDBに保存するんだ。保存にはredisを使おう。redisの設定値はXXXにあって、キーは…。保存できた?そしたら次は…」
「まず大雑把な手順を説明してくれよ。ユーザにツイートの情報を加えて保存したら、次は何だって?」
凝集度が高いコードは手順が明快で枝葉は隠蔽されている、わかる 凝集度が低いコードは手順の合間合間に煩雑な処理が入り、わかりがない
凝集度を上げる
コンスタンチンとヨードンは、凝集度を以下のように7つのレベルに分類し、その危険性を指摘しています。なお、凝集度はレベルの高い方を良しとします。
機能的凝集
1つの機能だけが存在
1つの機能だけがある関数の呼び出し分けをする
2つ以上の機能が存在
いずれの機能も特定のデータを処理する
機能の呼び出し順序は重要
Aの次にBを呼び出したい
機能を分離して得られる旨味がない
通信的凝集
逐次的凝集との違いは、呼び出し順序が重要でない点
AとB、どちらを先に呼び出してもいい
例:複数イベントのキューイング
マイヤーが提唱している『複合設計』では、この二つは、「連絡的強度」としてひとつに扱われています。 手順的凝集
通信的凝集との違い
機能が共通の特定のデータを処理しない
この状態は、上位の関数が一連の処理を実行するために、複数の関数を呼びだすのが面倒になったとき、幾つかの機能を、処理の順番にひとつの関数に収めたようなときに起きます。
この辺りから、関数の再利用性は非常に悪くなってしまい、保守作業に支障を来すようになるので注意が必要です。
一時的凝集
ある時点だけ実行する関数の中に、幾つかの機能が含まれている状態です
初期処理
エラー処理
手順的凝集と何が違うの?kadoyau.icon
「ある時点だけ実行」?
これは、そこに含まれる幾つかの機能が、外から(上位関数から)の指示で選択されるのが特徴です。
ひとつの関数の中に含まれている幾つかの機能が、一回の呼び出しでシーケンスに処理されるのではなく、選択された機能だけが実行される状態です。
処理の選択方法がちょっとでも分かりにくいと、一気に理解度を低下させることになります。