『プリンシプル オブ プログラミング』視点編を10問で学べるクイズサイト

設計で迷わない目をクイズで養う!
第4章:視点 要約&クイズ

公開日:
最終更新日:

コードの良し悪しを見抜くには、多角的な視点が必要です。本ページでは、視点編で学ぶべき要点を要約で一気に解説します。

要約でチェックポイントを学び、10問のクイズで実践。一歩踏み込んだプロの視点を身につけて、より質の高いコーディングを目指しましょう!

今すぐクイズに挑戦
(10問・約3分・解説つき)
プリンシプルオブプログラミング
1分で理解&101の原則総まとめ!

第4章:視点 目次

  1. 第4章:視点の要点・要約を読む(5分)
    1. 4.1 凝集度(Cohesion)
    2. 4.2 結合度(Coupling)
    3. 4.3 直交性(Orthogonality)
    4. 4.4 可逆性(Reversibility)
    5. 4.5 コードの臭い(Bad smell in code)
    6. 4.6 技術的負債(Technical Debt)
  2. クイズに挑戦する(10問)

  1. プログラミング クイズ一覧へ
  2. 次のクイズへ(第5章:習慣)
  3. 前のクイズへ(第3章:思想)
  4. 『プリンシプル オブ プログラミング』101の原理・原則総まとめ

  1. 参考文献・出典
  2. このページの著者
  3. シェア

第4章:視点
~プログラマの見る角度~

4.1 凝集度(Cohesion)

  • 要旨

    凝集度とは、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つのことだけ」を意識する。

4.2 結合度(Coupling)

  • 要旨

    結合度とは、モジュール同士がどれくらい強くつながっているかを表す指標で、弱いほど良い
  • 理由

    つながりが強すぎると、お互いに依存し合い、1つを変えたときにもう片方まで直さないといけなくなる。結果として、変更の波及・理解のむずかしさ・障害のリスクが高まる。
  • 結論

    データ結合(本当に必要なデータだけを渡す形)を目標に、はっきり決めたインターフェース(外から見える窓口)を通じてやり取りし、変更の影響範囲を小さくする。
  • その他(レベル・注意・指針)

    • 結合度の6レベル(強→弱)
      • レベル1:内容結合
        他モジュールの内部に直接アクセスしたり書き換えたりする状態(最悪)。片方を直すともう片方も壊れやすい。
      • レベル2:共通結合
        グローバル変数(どこからでも見える変数)を一緒に使っている状態。
      • レベル3:外部結合
        外部宣言(publicな変数・関数など)を共有している状態。まだ結びつきは強い。
      • レベル4:制御結合
        フラグ(0/1などの切り替え変数)で相手の振る舞いを細かく指示している状態。相手の中身をよく知っている必要がある。
      • レベル5:スタンプ結合
        構造体やクラスなどの複合データを丸ごと渡してしまう状態。実際には使わない項目まで含まれてしまう。
      • レベル6:データ結合
        本当に必要な単体の値(スカラ値)だけを引数として渡す状態。もっとも望ましい。
    • 相互依存の問題
      • 強く結びついたモジュール同士では、1つを変更するときに、関連するコードを一緒に理解・修正しなければならず、作業が重くなる。
    • 指針
      • データの受け渡しはできるだけ引数で行い、戻り値で結果を返す。
      • データの置き場所としてグローバル変数はできるだけ使わない
      • 制御フラグに頼る関数(例:「mode=1 で追加/0で削除」のような関数)は、役割ごとに関数を分ける。
      • 結合の強さ・太さだけでなく、つながりの本数や方向(多対多・双方向)にも注意する。

4.3 直交性(Orthogonality)

  • 要旨

    コードの要素同士をできるだけ独立させ、互いに影響し合わないようにする。1つを変えても、別の部分に影響が「移りにくい」状態を作る。
  • 理由

    直交性が高いと、変更しても影響範囲を小さく保てるので、生産性(開発・修正の速さ)が上がり、依存が少ない分だけリスク(バグや予想外の動き)も下がる。
  • 結論

    モジュール間の結合度を最小限にし、役割ごとにはっきりした境界やレイヤーを決めて直交性を保つ。
  • その他(メリット・指針)

    • メリット
      • 生産性の向上
        変更が1か所で完結しやすく、開発・テストにかかる時間を短くできる。疎結合(ゆるいつながり)な部品は他の場所でも再利用しやすい。
      • リスクの軽減
        問題が起きても影響範囲を限定しやすく、テスト対象も絞れるので、より堅牢なシステムに近づく。
    • 指針
      • コードのレイヤー化
        画面・アプリケーションロジック・データアクセスなど、役割ごとにレイヤーを分けて整理・抽象化する。各レイヤーは1つ下のレイヤーの公開された抽象(インターフェース)だけを使う。
      • リレーションの直交性
        データの重複登録を避け、1つの事実は1か所だけに持つ(正規化)。年度ごとにほぼ同じテーブルをコピーするなどの安易な重複は避ける。

4.4 可逆性(Reversibility)

  • 要旨

    あとからやり直し(アンドゥ)しやすい選択・設計を心がけ、できるだけ後戻りできない決定を避ける。
  • 理由

    「これで完全に決まり」という最終決定はほとんど存在せず、前提となる事実や技術が変わることが多い。その変化に合わせて戻れない設計にしてしまうと、システムが簡単に行き詰まってしまう。
  • 結論

    将来の変更に耐えられるよう、モジュールをなるべく柔軟で適応力があり、疎結合で独立性の高い形で設計する。必要に応じて、アーキテクチャ(上位の全体的な設計)の時点で間接化のレイヤー(ラッパー・ゲートウェイなど)を挟んでおく。
  • その他(指針・効果)

    • 指針:特定メーカーの製品や特定クラウドサービスなど、1つの技術に深く結びつきすぎないようにする。モジュールをしっかり分けておき、1部分だけを他の方式に差し替えやすくしておく。
    • 効果:間違っていたと分かったときにロールバック(元に戻すこと)がしやすくなり、要件や環境の変化に伴うリスクを小さくできる。

4.5 コードの臭い(Bad smell in code)

  • 要旨

    コードを読んだときの「何か変だ」「触りたくないな」という違和感を「臭い」と呼び、理解しにくい/修正しにくい/拡張しにくいサインとして捉える。
  • 理由

    臭いは、設計や実装のどこかに問題があることを教えてくれる警告サインだから。小さなうちにリファクタリング(振る舞いを変えずにコードを整理・改善すること)すれば、品質を取り戻し、さらに良くできる。
  • 結論

    典型的な「臭いのパターン」を知っておき、テストで守りながら小さな変更を少しずつ行うことで、安全に改善していく。
  • その他(代表例)

    • よく見かける
      ほぼ同じコードがあちこちに出てくる。→ 共通部分を見つけて1つの関数・メソッドにまとめる
    • 長すぎる
      1つの関数やファイルが非常に長い。→ 処理のまとまりごとに関数やクラスに分割して短くする。
    • 大きすぎる
      1つのモジュールがあまりにも多くの責務を持っている。→ 「1つのモジュール=1つの役割」になるように分解する。
    • 多すぎる
      ほとんど仕事をしていない中間モジュールがたくさんある。→ 不要な仲介を取り除き、まとめられるものは統合する。
    • 名前が合わない
      名前から想像した動きと、実際の動きが違う。→ 実際の役割に合わせて名前を改善する。必要なら中身の責務も調整する。

4.6 技術的負債(Technical Debt)

  • 要旨

    締め切りやスピードを優先してとりあえず動くコードを書いたとき、その「手抜き部分」はあとで返すべき借金になる。緊急時に一時的に選ぶことはあっても、放置せず早めに返す必要がある。
  • 理由

    技術的負債を抱えたままにすると、後の保守や新機能追加のたびに余計な手間がかかり、バグが出やすくなるなど、利息のようにコストが膨らんでいくから。
  • 結論

    やむを得ず負債を取る場合は、「ここは仮の実装である」と明示して記録し、できるだけ早いタイミングできれいな実装に置き換える(返済する)。一時しのぎの暫定ソリューションも同じように扱う。
  • その他(運用・範囲)

    • 運用
      技術的負債の一覧を作り、「何が」「どこに」「どのくらい危ないか」「いつまでに返すか」を可視化する。定期的な計画の中に返済タスクを入れ、少しずつでも解消していく。
    • 範囲
      暫定で入れたコードは、そのまま本番運用に残り続けてしまいがち。「一時的だから」と放置せず、早めにリファクタリングして健全な状態に戻すことを習慣にする。

プリンシプル オブ プログラミング(第4章:視点)

1. 【4.4.可逆性①】
「可逆性」のある設計の利点として、最も適切なものはどれか?

2. 【4.5.コードの臭い⑧】
次のうち「臭い」に該当しない行動はどれか?

3. 【4.4.可逆性④】
「可逆性」における判断・設計の基本方針として適切でないものはどれか?

4. 【4.6.技術的負債②】
技術的負債のリスクとして、最も適切なものはどれか?

5. 【4.3.直交性⑩】
「直交性」が高いシステム設計におけるリスク軽減の効果として、最も適切なものはどれか?

6. 【4.4.可逆性⑧】
以下のうち、「可逆性の高い設計にする工夫」として適切でないものはどれか?

7. 【4.4.可逆性⑦】
「可逆性が重要になる場面」として最も適切なものはどれか?

8. 【4.5.コードの臭い⑤】
次のうち、「多すぎる」臭いの典型例として最も適切なものはどれか?

9. 【4.2.結合度⑤】
「構造体などの複合データを渡すが、モジュール側が必要な一部のデータしか使わない」ような結合はどれか?

10. 【4.5.コードの臭い④】
関数やモジュールが「複数の責任を持っている」状態を示す臭いはどれか?

次のクイズ(第5章:習慣)へ

第4章:視点
採点結果

正答率:0%

-

-

参考文献・出典

  • プリンシプル オブ プログラミング ~3年目までに身につけたい一生役立つ101の原理原則~
  • 上田 勲(著)/秀和システム/第1版14刷/2025年/ISBN978-4-7980-4614-3

※本ページは学習支援を目的とした要約です。実務適用時は原典もご参照ください。

このページの著者

もちもちみかん(システムエンジニア)

社内SEとしてグループ企業向けの業務アプリを要件定義〜運用まで一気通貫で担当しています。

経験:Webアプリ/業務システム

得意:PHP・JavaScript・MySQL・CSS

個人実績:フォーム生成基盤クイズ学習プラットフォーム

詳しいプロフィールはこちら!  もちもちみかんのプロフィール

もちもちみかん0系くん
TOPへ

もちもちみかん.comとは


このサイトでは、コーディングがめんどうくさい人向けのお助けツールとして、フォームやCSSをノーコードで生成できる、
 もちもちみかん.forms
 もちもちみかん.css1
 もちもちみかん.css2
と言ったジェネレーターを用意してます。

また、このサイトを通じて、「もちもちみかん」のかわいさを普及したいとかんがえてます!