目次

    1. Single Responsibility Principle(単一責任の原則)

    あなたが小さなカフェを経営しているとします。最初は一人でコーヒーを淹れ、会計をし、掃除までこなしています。最初のうちは問題ありません。

    しかし、少しずつお客さんが増えてきて、忙しくなります。注文を取りながらお釣りを計算し、掃除もしなければならない。結果としてミスが増え、どれも中途半端になってしまいました。

    この状況は、ひとつのクラスに複数の責任を持たせているのと同じです。役割を分けて、「バリスタ」「レジ係」「清掃スタッフ」と責任を分担すれば、それぞれが自分の仕事に集中でき、お店全体もスムーズに回ります。これが単一責任の原則です。

    2. Open/Closed Principle(開放/閉鎖の原則)

    あなたのカフェでは、季節ごとに特別メニューを提供しています。春は「桜ラテ」、夏は「アイスコーヒー」などです。

    ところが、メニューを増やすたびに古いメニュー表を印刷し直し、価格計算のルールも書き換えなければなりません。そのたびに混乱が起きます。

    そこで、「季節ごとのメニューを追加できるように」仕組みを変えました。新しいメニューを登録するだけで反映されるようにしたのです。既存のメニュー表を壊さずに、新しい内容を“追加”できるようになりました。

    これが「変更に閉じ、拡張に開かれている」状態です。つまり、今ある仕組みを壊さずに新しい機能を増やせる設計が理想です。

    3. Liskov Substitution Principle(リスコフの置換原則)

    配達サービスを考えてみましょう。普通の配達員は自転車で荷物を届けますが、冷凍品を扱う「冷凍配達員」もいます。

    冷凍配達員を通常の配達員として扱ってしまうと、「冷凍品を常温で届けてしまう」などのトラブルが起きます。つまり、見た目は似ていても、同じ使い方をしてはいけない場合があるのです。

    この原則は「上位の型(親クラス)を置き換えても動作が壊れないこと」を求めています。つまり、同じ“配達員”でも、冷凍品用・通常用を区別して扱う設計にすれば、安全で正しい振る舞いが保証されます。

    4. Interface Segregation Principle(インターフェース分離の原則)

    あなたが家電メーカーの開発担当だとします。新しい多機能プリンタを作りました。印刷もスキャンもFAXもできるモデルです。

    ところが、小さなオフィスでは「印刷しか使わない」顧客もいます。それなのに、スキャン機能やFAX機能の設定もしないと使えない構造になっていたら、ユーザーは不便に感じるでしょう。

    そこで、「印刷機能だけのシンプルモデル」「スキャン専用モデル」をそれぞれ提供するようにしました。必要な機能だけを切り出した設計です。

    これがインターフェース分離の原則です。利用者が必要なものだけを使えるようにすることで、シンプルで柔軟な構造になります。

    5. Dependency Inversion Principle(依存性逆転の原則)

    あなたがレストランを経営していて、特定のパン屋さんから毎朝パンを仕入れているとします。ある日、そのパン屋さんが休業してしまいました。仕入れが止まり、営業にも支障が出ます。

    このように、特定の“相手”に依存してしまうと、相手が変わった時にこちらも困ります。

    そこで、「パン屋から仕入れる」という具体的な仕組みに依存するのではなく、「パンを提供してくれる業者」という抽象的な契約(ルール)を決めます。これに従えば、どのパン屋でも代わりに納入できます。

    これが依存性逆転の原則です。上位の仕組みが具体的な実装に依存しないことで、柔軟で変更に強い設計になります。

    まとめ

    - SOLID原則は、チーム開発や長期運用におけるトラブルを防ぐための基本です。
    - 一見理屈っぽく感じても、実際には日常生活の中にも同じ考え方が多く存在します。
    - 責任の分担、変更に強い設計、安全な置き換え、必要な機能の分離、そして柔軟な依存関係。
    これらを意識することで、システムはより健全で成長しやすいものになります。

    PREV
    2025.11.10
    CursorとClaude Code比較
    NEXT
    2025.11.27
    なぜ今、Markdown(マークダウン)が最強のツールなのか