AI駆動で迷わない設計の視点をクイズで養う!
プリンシプル オブ プログラミング 第4章:視点
公開日:
最終更新日:
AI駆動開発で迷いが増えるのは、選択肢が増えるからです。だからこそ必要なのが「設計の見方(視点)」です。本ページでは、『プリンシプル オブ プログラミング』第4章「視点」で紹介される6つの視点を、要点を押さえた要約と4択クイズで整理します。
要約で視点の狙いをつかみ → 4択クイズ(10問・全問解説付き)で判断力をチェック → 迷ったところは解説で復習。「読む→解く→わかる」で、AIへの指示出しとレビューの精度を高める設計の目を鍛えましょう。
第4章:AI駆動で迷わない設計の「視点」クイズ! 目次
- プログラミング クイズ一覧へ
- 次のクイズへ(第5章:AIに優しい開発「習慣」クイズ!)
- 前のクイズへ(第3章:AIに差をつける設計「思想」クイズ!)
- 『プリンシプル オブ プログラミング』101の原理・原則総まとめ
第4章:視点
~プログラマの見る角度~
4.1 凝集度(Cohesion)
AI重要 ★★★★AI核心原則
要旨
凝集度とは、1つのモジュール(クラス・関数など)の中に入っている機能がどれだけ同じ目的にまとまっているかを表す指標で、高いほど良い。理由
1つのモジュールが1つの役割に集中しているほど、やりたいことが分かりやすくなり、コードを理解・変更・再利用しやすくなるから。結論
機能的強度(1モジュール=1役割)の状態を目標に、どのモジュールが何を担当するかをはっきりさせる。その他(レベル・効果・指針)
- 凝集度の7レベル(弱→強)
レベル1:暗合的強度
たまたま同じ場所に置かれただけの寄せ集め。要素同士に特別なつながりがなく、再利用もしにくい。レベル2:論理的強度
「入力系」「出力系」など抽象的には似ているが、実際の処理同士の関係が弱い。レベル3:時間的強度
起動時にまとめて実行する初期化処理など、「同じタイミングで動くから」という理由だけで集めた状態。レベル4:手順的強度
大きな手順の一部分だけを1モジュールにしていて、処理の流れ全体とは切り離しづらい。レベル5:連絡的強度
手順的強度に加えて、同じデータの受け渡しや参照をしている状態。まだ1モジュールに複数の役割が混ざっている。レベル6:情報的強度
あるデータ構造(例:ユーザー情報)を扱う複数の処理を1か所に集めた状態。入り口ごとに役割は1つ。レベル7:機能的強度
中の命令がすべて1つの目的達成のためにきれいにつながっている理想的な状態。
- 低凝集の弊害
- 1つのモジュールがいろいろなことをしていて、コードが何をしたいのか分かりにくい。
- どこを直せば良いか分かりにくくなり、コードが保守しにくい。
- 一部分だけ他のところで使いたくても切り出しにくく、コードが再利用しにくい。
- 1か所の変更が他の機能にも影響しやすく、コードが壊れやすい(脆弱)。
- 高凝集の利点
- 1モジュール1役割に近づくため、コードが直感的に理解しやすい。
- 担当する範囲がはっきりしているので、コードが保守しやすい。
- 1つの役割にまとまっているので、必要な所へ部品として再利用しやすい。
- 役割ごとに分かれていることで、モジュール間の疎結合(ゆるいつながり)も実現しやすい。
- 指針
- できるだけ機能的強度を目指す。「1つのソフトウェア/モジュールには基本1つのことだけ」を意識する。
- 凝集度の7レベル(弱→強)
💡AIワンポイント
凝集度を保つには、AIが追加するコードをモジュール目的でふるい分けます。関連しない処理が混じったら即分離し、責務を一つへ戻します。レビュー時は「このモジュール名で説明できるか」を合否基準にします。関連用語(用語集で復習)
4.2 結合度(Coupling)
AI重要 ★★★★★AI核心原則
要旨
結合度とは、モジュール同士がどれくらい強くつながっているかを表す指標で、弱いほど良い。理由
つながりが強すぎると、お互いに依存し合い、1つを変えたときにもう片方まで直さないといけなくなる。結果として、変更の波及・理解のむずかしさ・障害のリスクが高まる。結論
データ結合(本当に必要なデータだけを渡す形)を目標に、はっきり決めたインターフェース(外から見える窓口)を通じてやり取りし、変更の影響範囲を小さくする。その他(レベル・注意・指針)
- 結合度の6レベル(強→弱)
レベル1:内容結合
他モジュールの内部に直接アクセスしたり書き換えたりする状態(最悪)。片方を直すともう片方も壊れやすい。レベル2:共通結合
グローバル変数(どこからでも見える変数)を一緒に使っている状態。レベル3:外部結合
外部宣言(publicな変数・関数など)を共有している状態。まだ結びつきは強い。レベル4:制御結合
フラグ(0/1などの切り替え変数)で相手の振る舞いを細かく指示している状態。相手の中身をよく知っている必要がある。レベル5:スタンプ結合
構造体やクラスなどの複合データを丸ごと渡してしまう状態。実際には使わない項目まで含まれてしまう。レベル6:データ結合
本当に必要な単体の値(スカラ値)だけを引数として渡す状態。もっとも望ましい。
- 相互依存の問題
- 強く結びついたモジュール同士では、1つを変更するときに、関連するコードを一緒に理解・修正しなければならず、作業が重くなる。
- 指針
- データの受け渡しはできるだけ引数で行い、戻り値で結果を返す。
- データの置き場所としてグローバル変数はできるだけ使わない。
- 制御フラグに頼る関数(例:「mode=1 で追加/0で削除」のような関数)は、役割ごとに関数を分ける。
- 結合の強さ・太さだけでなく、つながりの本数や方向(多対多・双方向)にも注意する。
- 結合度の6レベル(強→弱)
💡AIワンポイント
結合度を下げるなら、AI提案の引数に巨大オブジェクトを渡しすぎないよう制限します。必要項目だけ渡す方が変更影響を絞れます。依存追加時は import 数よりも変更連鎖の長さを見て判断します。関連用語(用語集で復習)
4.3 直交性(Orthogonality)
要旨
コードの要素同士をできるだけ独立させ、互いに影響し合わないようにする。1つを変えても、別の部分に影響が「移りにくい」状態を作る。理由
直交性が高いと、変更しても影響範囲を小さく保てるので、生産性(開発・修正の速さ)が上がり、依存が少ない分だけリスク(バグや予想外の動き)も下がる。結論
モジュール間の結合度を最小限にし、役割ごとにはっきりした境界やレイヤーを決めて直交性を保つ。その他(メリット・指針)
- メリット
生産性の向上
変更が1か所で完結しやすく、開発・テストにかかる時間を短くできる。疎結合(ゆるいつながり)な部品は他の場所でも再利用しやすい。リスクの軽減
問題が起きても影響範囲を限定しやすく、テスト対象も絞れるので、より堅牢なシステムに近づく。
- 指針
コードのレイヤー化
画面・アプリケーションロジック・データアクセスなど、役割ごとにレイヤーを分けて整理・抽象化する。各レイヤーは1つ下のレイヤーの公開された抽象(インターフェース)だけを使う。リレーションの直交性
データの重複登録を避け、1つの事実は1か所だけに持つ(正規化)。年度ごとにほぼ同じテーブルをコピーするなどの安易な重複は避ける。
- メリット
💡AIワンポイント
直交性では、AI生成設定値の重複定義をなくします。同じ意味のフラグが複数箇所にあると、修正時に食い違いが起きます。関連用語(用語集で復習)
4.4 可逆性(Reversibility)
要旨
あとからやり直し(アンドゥ)しやすい選択・設計を心がけ、できるだけ後戻りできない決定を避ける。理由
「これで完全に決まり」という最終決定はほとんど存在せず、前提となる事実や技術が変わることが多い。その変化に合わせて戻れない設計にしてしまうと、システムが簡単に行き詰まってしまう。結論
将来の変更に耐えられるよう、モジュールをなるべく柔軟で適応力があり、疎結合で独立性の高い形で設計する。必要に応じて、アーキテクチャ(上位の全体的な設計)の時点で間接化のレイヤー(ラッパー・ゲートウェイなど)を挟んでおく。その他(指針・効果)
💡AIワンポイント
可逆性を意識して、AIによる大規模変更は機能フラグで段階導入します。戻し手順を先に用意すると本番判断が速くなります。関連用語(用語集で復習)
4.5 コードの臭い(Bad smell in code)
要旨
コードを読んだときの「何か変だ」「触りたくないな」という違和感を「臭い」と呼び、理解しにくい/修正しにくい/拡張しにくいサインとして捉える。理由
臭いは、設計や実装のどこかに問題があることを教えてくれる警告サインだから。小さなうちにリファクタリング(振る舞いを変えずにコードを整理・改善すること)すれば、品質を取り戻し、さらに良くできる。結論
典型的な「臭いのパターン」を知っておき、テストで守りながら小さな変更を少しずつ行うことで、安全に改善していく。その他(代表例)
よく見かける
ほぼ同じコードがあちこちに出てくる。→ 共通部分を見つけて1つの関数・メソッドにまとめる。長すぎる
1つの関数やファイルが非常に長い。→ 処理のまとまりごとに関数やクラスに分割して短くする。大きすぎる
1つのモジュールがあまりにも多くの責務を持っている。→ 「1つのモジュール=1つの役割」になるように分解する。多すぎる
ほとんど仕事をしていない中間モジュールがたくさんある。→ 不要な仲介を取り除き、まとめられるものは統合する。名前が合わない
名前から想像した動きと、実際の動きが違う。→ 実際の役割に合わせて名前を改善する。必要なら中身の責務も調整する。
💡AIワンポイント
コードの臭い検知には、AI生成差分へ複雑度と重複率チェックを通します。匂いを見つけた時点で小さく直す方が安上がりです。関連用語(用語集で復習)
4.6 技術的負債(Technical Debt)
要旨
締め切りやスピードを優先してとりあえず動くコードを書いたとき、その「手抜き部分」はあとで返すべき借金になる。緊急時に一時的に選ぶことはあっても、放置せず早めに返す必要がある。理由
技術的負債を抱えたままにすると、後の保守や新機能追加のたびに余計な手間がかかり、バグが出やすくなるなど、利息のようにコストが膨らんでいくから。結論
やむを得ず負債を取る場合は、「ここは仮の実装である」と明示して記録し、できるだけ早いタイミングできれいな実装に置き換える(返済する)。一時しのぎの暫定ソリューションも同じように扱う。その他(運用・範囲)
運用
技術的負債の一覧を作り、「何が」「どこに」「どのくらい危ないか」「いつまでに返すか」を可視化する。定期的な計画の中に返済タスクを入れ、少しずつでも解消していく。範囲
暫定で入れたコードは、そのまま本番運用に残り続けてしまいがち。「一時的だから」と放置せず、早めにリファクタリングして健全な状態に戻すことを習慣にする。
💡AIワンポイント
技術的負債を取るなら、AIが生んだ暫定実装に返済条件を添えます。期限と置換先が無い仮対応は、ほぼ恒久化します。関連用語(用語集で復習)
プリンシプル オブ プログラミング(第4章:視点)
1. 【4.1.凝集度⑤】
解説: 情報的強度は、共通のデータ構造を扱う独立した機能群が同一モジュール内に存在する構造。各機能には個別の入口点が存在するのが特徴である。
2. 【4.2.結合度⑨】
モジュール間の「結合の方向」に関する説明として、最も適切なものはどれか?
解説: 結合方向が双方向になると、相互に変更の影響を受けやすくなり、保守性・再利用性が低下する。依存関係は一方向に保つのが望ましい。
3. 【4.2.結合度⑥】
最も望ましいモジュール間の結合はどれか?
解説: データ結合は、引数などを通じてスカラー型の明確なデータのみを渡す方式であり、モジュール間の依存性が低く、最も望ましい結合である。
4. 【4.5.コードの臭い①】
「コードの臭い」とは、ソースコードにどのような兆候があることを指すか?
解説: 「コードの臭い」とは、設計上の問題が潜んでいることを示す兆候であり、保守性・拡張性に悪影響を及ぼす可能性がある。
5. 【4.4.可逆性③】
ソフトウェアにおいて「可逆性が高い設計」として最もふさわしいものはどれか?
解説: 構成を抽象化しレイヤーで分離することで、技術や仕様の変更にも対応しやすくなり、可逆性が高まる。
6. 【4.6.技術的負債⑦】
技術的負債に関する「チーム文化」として、望ましいものはどれか?
解説: チーム全体で技術的負債を「返済すべきもの」として共有し、リファクタリングに取り組む文化を築くことが重要である。
7. 【4.6.技術的負債⑧】
次のうち、技術的負債を避けるための有効な予防策として適切なものはどれか?
解説: 拡張性・保守性を意識した設計と実装は、技術的負債を生みにくくする予防策として非常に有効である。
8. 【4.4.可逆性⑩】
「可逆性」の本質的な意味として最も適切なものはどれか?
解説: 可逆性とは、「変化があっても元に戻せる柔軟性」を持つことであり、変化を前提にした設計思想である。
9. 【4.3.直交性⑧】
以下の設計上の行為のうち、「直交性を損なう行為」として最も適切なものはどれか?
解説: 他モジュールに直接影響する変更は、モジュール間の直交性が保たれていない証拠であり、設計としては望ましくない。
10. 【4.3.直交性⑤】
「直交性」に関するデータベース設計上の注意点として、最も適切なものはどれか?
解説: データベースにおける直交性とは、重複や依存関係を避けて、各テーブルが明確な責任を持ち、一意性を維持する設計である。
参考文献・出典
- プリンシプル オブ プログラミング ~3年目までに身につけたい一生役立つ101の原理原則~
- 上田 勲(著)/秀和システム/第1版14刷/2025年/ISBN978-4-7980-4614-3
※本ページは学習支援を目的とした要約です。実務適用時は原典もご参照ください。
このサイトの運営者
経験:Webアプリ・業務システム
得意:PHP・JavaScript・MySQL・CSS
制作・運用中:フォーム生成基盤・クイズ学習プラットフォーム・htmx逆引きレシピ 等
AI時代のエンジニアタイプ診断:CSPF/とろとろみかん
詳しいプロフィールはこちら! もちもちみかんのプロフィール