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

設計セオリーをクイズで定着!
「プログラミングセオリー」要約&クイズ

公開日:
最終更新日:

本ページでは、プログラミングの背景にあるセオリー(理論)要点要約で整理します。単なる知識ではなく、設計の意図を理解することが目標です。

要約で理論を理解し、10問のクイズで定着。なぜその設計を選ぶのか、を論理的に説明できるようになりましょう!

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

プログラミングセオリー 目次

  1. プログラミングセオリーの要点・要約を読む(5分)
    1. 3.1 プログラミングセオリー(Programming theory)
    2. 3.2 3つの価値①:コミュニケーション(Communication)
    3. 3.3 3つの価値②:シンプル(Simplicity)
    4. 3.4 3つの価値③:柔軟性(Flexibility)
    5. 3.5 6つの原則①:結果の局所化(Local consequences)
    6. 3.6 6つの原則②:繰り返しの最小化(Minimize repetition)
    7. 3.7 6つの原則③:ロジックとデータの一体化(Logic and Data together)
    8. 3.8 6つの原則④:対称性(Symmetry)
    9. 3.9 6つの原則⑤:宣言型の表現(Declarative Expression)
    10. 3.10 6つの原則⑥:変更頻度(Rate of Change)
  2. クイズに挑戦する(10問)

  1. プログラミング クイズ一覧へ
  2. 第3章目次へ
  3. 次のクイズへ(アーキテクチャ根底技法)
  4. 前のクイズへ(第2章:原則)
  5. 『プリンシプル オブ プログラミング』101の原理・原則総まとめ

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

第3章:思想①
~プログラミングセオリー~

3.1 プログラミングセオリー(Programming theory)

  • 要旨

    「最高のコード」とは、拡張しやすく、ムダが少なく、読みやすく、理解しやすいコードのこと。その土台になる考え方が「セオリー(理論・考え方の枠組み)」で、3つの価値(コミュニケーション/シンプル/柔軟性)を大事にしている。
  • 理由

    「大事にしたい価値」→「守るべき原則」→「具体的なコード」というつながりをはっきりさせておくと、読みやすさ・拡張しやすさなどの品質と、日々の「この書き方でいいかな?」という細かい判断を結びつけやすくなるから。
  • 結論

    3つの価値をスタート地点(動機)にして、6つの原則を中継地点(考え方のルール)として使い、最終的にコードという形の解決策に落とし込んでいく。
  • その他(範囲・効果・構成要素)

    • 3つの価値(Three values)
      • コミュニケーション(Communication)…人に意味が伝わることを重視する。
      • シンプル(Simplicity)…ムダな複雑さを削ることを重視する。
      • 柔軟性(Flexibility)…あとから変えやすいことを重視する。
    • 6つの原則(Six principles)
      • 結果の局所化(Local consequences)…変更の影響を狭い範囲に閉じ込める
      • 繰り返しの最小化(Minimize repetition)…同じことを何度も書かない
      • ロジックとデータの一体化(Logic and Data together)…処理とデータを近くにまとめる
      • 対称性(Symmetry)…同じ種類のものは同じパターンで書く
      • 宣言型の表現(Declarative Expression)…「どうやるか」より「何をしたいか」を書く。
      • 変更頻度(Rate of Change)…同じ理由・同じタイミングで変わるもの を同じ場所に集める。

3.2 3つの価値①コミュニケーション(Communication)

  • 要旨

    コードはコンピュータに命令するためのものであると同時に、人に見せるドキュメント(説明書)=コミュニケーションの道具でもある。
  • 理由

    開発にかかるコストの多くは、新規開発よりも保守(あとから直したり追加したりする作業)で発生する。そこで、他の人(=未来の自分も含む)がコードを読みやすいかどうかが、作業の速さ・バグの少なさにそのまま効いてくるから。
  • 結論

    常に「他の人はこのコードを見てどう感じるだろう?」を想像し、読みやすさ意図(Why)が伝わることを最優先にする。
  • その他(効果・実践)

    • 効果:コードレビューのスピードアップ/変更着手のハードルが下がる/バグに早く気づきやすくなる。
    • 実践
      • 命名を一貫させる(同じ意味には同じ単語を使う)。
      • コードだけでは分かりにくい部分は、「なぜそうしているか(Why)」をコメントで補う。
      • インターフェース(外から見える入口)は必要最小限にしてシンプルに保つ。
      • 驚き最小の原則(予想外の動きをさせない)を意識する。

3.3 3つの価値②シンプル(Simplicity)

  • 要旨

    ここで言う「シンプル」とは、機能を削ることではなく、必要以上の複雑さを取り除いた状態のこと。動かすために必要な最小限で設計する。
  • 理由

    余計な複雑さは、ユーザーにとっても開発者にとってもあまり価値を生まず、バグ読みづらさ話が通じにくくなる原因になりやすいから。
  • 結論

    本当に必要な部分(玉)を見きわめて取り出し、不要な部分(石)は勇気を持って捨てる設計を徹底する。「毒をもって毒を制す」のように、「一時しのぎのパッチを何枚も当てる」ようなコードでごまかすのではなく、根本原因を直してシンプルにすることを優先する。
  • その他(範囲・指針)

    • KISS(Keep It Simple, Stupid)やYAGNI(You Aren't Going to Need It)を守り、足し算より引き算で考える。
    • 同じ処理の重複や、暗黙の依存関係を減らす(DRY・対称性の考え方を使う)。
    • 場当たり的な例外処理や「とりあえず」のコードは、期限やメモを付けて管理し、放置せずできるだけ早く整理する。

3.4 3つの価値③柔軟性(Flexibility)

  • 要旨

    柔軟性とは、あとから変更しやすいかどうかという性質。コードは最初から完成ではなく、変わり続ける前提で書くべきもの。
  • 理由

    現実の要求や環境は常に変化するので、コードも必ずどこかで変更が入る。そこで、変更しやすさ(変更容易性)が、長期的な品質(壊れにくさ・続けやすさ)を大きく左右するから。
  • 結論

    「拡張には開き、既存の修正には閉じる」というOCP(Open-Closed Principle)の考え方を意識する。関係が深いコードは近くにまとめ関係が薄い部分同士は、できるだけ依存しないように設計する。
  • その他(効果・実践)

    • 効果:変更が決まった部分だけで済むようになり、デグレード(前は動いていたところが壊れること)と工数を減らせる。
    • 実践
      • 1つのモジュールの中で役割をはっきりさせて凝集度(4章参照)を上げ、モジュール同士の結合度を下げる
      • インターフェース(抽象的な窓口)DI(Dependency Injection=依存性の注入)を使って、差し替えやすい構造にする。
      • 変更が起きやすい部分あまり変わらない部分でレイヤーを分けておく。
      • テストで振る舞いを固定し、安心して中身を作り替えられるようにする。

3.5 6つの原則①結果の局所化(Local consequences)

  • 要旨

    1か所を直したときに、その影響ができるだけ小さい範囲(局所)の中でおさまるようにコードを組み立てる考え方。
  • 理由

    変更の影響が広いと、「ここを直したら、あっちもこっちも動かなくなった…」という状態になり、テストも修正も爆発的に大変になってしまうから。
  • 結論

    「修正に対して閉じる」(OCP)の考えを取り入れ、変更は特定のモジュールの中だけで完結させられるように設計する。
  • その他(指針・効果)

    • 指針
      • 一緒に変わりやすいコード同士は、近くにまとめて配置する。
      • 1つのモジュールの責務(役割)を明確にしておく。
      • モジュールの境目(インターフェース)では、責任の範囲をはっきり分ける
    • 効果:回帰バグが減る/レビュー・テストの「見るべき場所」を絞りやすい/リリース時のリスクが下がる。

3.6 6つの原則②繰り返しの最小化(Minimize repetition)

  • 要旨

    同じ意味や同じ処理を何度も書かないようにする原則。1か所を変えれば、関連するところがまとめて変わる構造(DRY原則)を目指す。
  • 理由

    同じ内容があちこちにバラバラに書かれていると、「結果の局所化」が壊れてしまい、変更のたびに修正漏れや不整合(片方だけ直し忘れなど)が起きやすくなるから。
  • 結論

    コードを小さい部品に分解して整理し、共通する部分は1つにまとめて再利用する。
  • その他(手段)

    • ループ化/関数化/モジュール化で、処理を「最小の意味のかたまり」に分ける(数式の素因数分解のイメージ)。
    • よく使うパターンは、テンプレートコード生成ライブラリとして切り出し、コピペではなく再利用する。

3.7 6つの原則③ロジックとデータの一体化(Logic and Data together)

  • 要旨

    処理の流れ(ロジック)と、その処理が扱うデータを、できるだけ近い場所(同じ関数・同じモジュールなど)にまとめておく。
  • 理由

    実際の変更では、ロジックだけ・データだけが変わることは少なく、多くの場合「データの形」と「それをどう扱うか」がセットで変わる。離れた場所にあると、修正漏れやズレが起きやすくなるから。
  • 結論

    関連するロジックとデータを物理的に近く(コロケーション)に置き、データの近くにそのデータ用の処理を持たせる(カプセル化)ようにする。
  • その他(実践)

    • 特定のデータ型に対しては、そのデータに関するメソッド(操作)を一緒に持たせる。
    • 関連するデータとロジックの集まりを、1つのモジュールやクラスとして扱う。
    • DTO(Data Transfer Object=データの入れ物)や生データをアプリ全体にバラまくのではなく、境界部分で専用の型や構造に変換してから内部で使う。

3.8 6つの原則④対称性(Symmetry)

  • 要旨

    同じ種類の処理や機能は、同じルール・同じ形で書くようにそろえる(API名/引数/抽象度などの対称性を意識する)。
  • 理由

    対称性があると、「この関数がこうなら、あっちもきっとこうだろう」と予想しやすくなり、読みやすさが一気に上がるから。
  • 結論

    パターン・命名・引数・抽象度を意図的にそろえて設計し、「例外的な書き方」をなるべく減らす。
  • その他(具体例)

    • 追加する関数」があるなら、対になる「削除する関数」もそろえて用意する。
    • 同じグループに属する関数は、同じような引数の取り方にそろえる。
    • ある関数の中で呼ぶ関数たちの抽象度レベルをそろえる(SLAPの考え方:高いレベルの説明と低レベル詳細を混ぜない)。

3.9 6つの原則⑤宣言型の表現(Declarative Expression)

  • 要旨

    コードでは、できるだけ「どうやるか」より「何をしたいか」を中心に書く(命令型より宣言型のスタイルを選ぶ)。
  • 理由

    命令型(「まずAをして、そのあとBをして…」のような書き方)は、順番・分岐・状態を頭の中で追いかけないと理解しづらい。一方、宣言型は「こういう条件を満たすデータがほしい」のように、事実そのものを読む感覚で理解しやすいから。
  • 結論

    使える場面では積極的に宣言的な記述やデータ駆動(設定で動作を変えるスタイル)を取り入れ、意図が一目で分かるコードを目指す。
  • その他(手段)

    • アノテーション(属性・メタ情報)で設定をつけて、コードから離れた場所にルールをまとめる。
    • 特定の問題領域に特化したDSL(domain-specific language=ドメイン特化言語)で、「何がしたいか」を短い記述で表す。
    • if文だらけのコードではなく、設定ファイルやテーブルに条件と結果をまとめるデータ駆動設計を使う。

3.10 6つの原則⑥変更頻度(Rate of Change)

  • 要旨

    なぜ変えるのか(変更理由)」と「どのタイミングで変わるのか」が同じもの同士を、同じ場所に集めておくという考え方。
  • 理由

    1つのモジュールが、いくつも違う理由でしょっちゅう変更されていると、そのモジュールは壊れやすく、設計も分かりづらいものになっていくから。
  • 結論

    単一責任の原則(1モジュール=1つの変更理由)に従って配置し、モジュール同士はできるだけ疎結合に保つことで、「何のためのモジュールか」を明確にする。
  • その他(実践・効果)

    • 実践
      • 頻繁に変わる部分(例:画面や文言)と、あまり変わらない部分(例:ドメインルール)を別レイヤーに分ける。
      • 設定値・定数・メッセージなど「一括で変えたいもの」は、専用の場所に集約する。
    • 効果:同じファイルを複数人で編集して衝突することが減る/どこを直せばいいか分かりやすい/変更にかかる時間を見積もりやすくなる。

プリンシプル オブ プログラミング(第3章-プログラミングセオリー)

1. 【3.8.6つの原則④『対称性』②】
以下のうち、『対称性』を意識した実装として**最も適切なもの**はどれか?

2. 【3.7.6つの原則③『ロジックとデータの一体化』⑤】
『ロジックとデータの一体化』が特に有効となる場面はどれか?

3. 【3.6.6つの原則②『繰り返しの最小化』③】
『繰り返しの最小化』を実現するために**適切でない**手法はどれか?

4. 【3.7.6つの原則③『ロジックとデータの一体化』④】
ロジックとデータの距離が離れていると、どのような問題が起こりやすいか?

5. 【3.1.プログラミングセオリー④】
「無駄を削ぎ落とした簡潔な構造」に関係する価値はどれか?

6. 【3.7.6つの原則③『ロジックとデータの一体化』②】
『ロジックとデータの一体化』を実践する主な理由はどれか?

7. 【3.1.プログラミングセオリー⑤】
将来の要件変更に対応できる設計が備えるべき価値は?

8. 【3.8.6つの原則④『対称性』③】
『対称性』の原則に**反する実装**として適切なものはどれか?

9. 【3.5.6つの原則①『結果の局所化』②】
「結果の局所化」が不十分な場合、最も懸念される影響はどれか?

10. 【3.5.6つの原則①『結果の局所化』③】
「結果の局所化」と特に関連が深い設計原則はどれか?

次のクイズ(アーキテクチャ根底技法)へ

プログラミングセオリー
採点結果

正答率:0%

-

-

参考文献・出典

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

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

このページの著者

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

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

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

得意:PHP・JavaScript・MySQL・CSS

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

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

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

もちもちみかん.comとは


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

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