品質とは?
品質には、外部品質と内部品質がある。
そして、プログラムの品質は、内部品質のことを指し、品質が悪いと修正や拡張のコストが高くなります。
説明 | |
---|---|
外部品質 | ユーザーに見える要素で、仕様どおりに動く、バグがない、高速に動作する等 |
内部品質 | ユーザーに見えない要素で、保守性や柔軟性、可読性、一貫性等 |
品質の高いコードとは?
擬集度と結合度がその指標になり、擬集度が高く、結合度が低いコードが品質が高いコードとなります。
品質高い | 品質低い | |
---|---|---|
擬集度 | 高い | 低い |
結合度 | 低い | 高い |
擬集度
モジュール内の機能のまとまりの程度を示すもの
高凝集はなぜいいのか?
凝集度の高いシステムでは、コードの読みやすさと再利用の容易さが増し、複雑さが管理可能な程度に抑えられます。
低擬集だと?
- まとまりがなく、モジュールでやっていることを理解しづらく、読みにくい
- 色々な関心ごとがあり、変更の可能性が上がる。そして、条件分岐などが発生し、可読性、保守性が下がる
凝集度の程度
説明 | 品質 | |
---|---|---|
偶発的擬集 | 適当に処理をまとめた関数 | 最悪 |
論理的凝集 | IF文で実行を切り分けるているなど、論理的に似ている処理をまとめた関数 | |
時間的凝集 | 実行順に意味はなく、特定の時間における処理がまとまった関数 | |
手順的擬集 | 実行順に意味があり、特定の時間おける処理がまとまった関数 | |
通信的擬集 | 実行順に意味があり、同じ値を使う関数 | |
逐次的擬集 | 実行順に意味があり、手順間で値を受け渡し使う関数 | |
機能的擬集 | 単一の機能の関数 | 最良 |
結合度
モジュール間の相互依存性の程度を示すもの
結合度が低いとなにがいい?
- モジュール間の結合の数が少ないほうが、構造がシンプルになり、可読性が増す
- モジュールを使う時に知っておくべき知識が少ないほど、モジュールの用途が理解しやすく使いやすいモジュールになります
結合度の程度
説明 | 品質 | |
---|---|---|
内部結合 | 他の関数と外部宣言されていない値で結合されている | 最悪 |
共通結合 | 共通のグローバル変数と結合されている | |
外部結合 | パブリック変数で結合されている | |
制御結合 | 利用する側はフラグなどを渡し、それを使って条件分岐する結合がされている | |
スタンプ結合 | オブジェクトや構造体を渡すことで結合されている | |
データ結合 | スカラー値を渡すことで結合されている | |
メッセージ結合 | 値の受け渡しをしない | 最良 |
コードレビューにおいても活かされる
擬集度と結合度は、品質の高いコードの指標です。
コードレビューの際にその指標を踏まえ、コメントすることで、より品質の高いコードへの証明となり、説得力が増します。
コメント例 | コメント種類 | |
---|---|---|
ASIS | モジュールを分けた方が、読みやすくなると思います。 | 感覚的なコメント |
TOBE | 論理的擬集になるので、モジュールを分けましょう。その方が擬集度が上がり、可読性が増します。 | 論理的なコメント |
参考資料
https://speakerdeck.com/sonatard/coheision-coupling
https://note.com/cyberz_cto/n/n26f535d6c575#E0aBe