慣性聚合 関心のあるブログ、ニュース、テクノロジーを効率的に追跡
原文を読む 慣性聚合で開く

おすすめ購読元

Google DeepMind News
Google DeepMind News
人人都是产品经理
人人都是产品经理
M
MIT News - Artificial intelligence
博客园 - 叶小钗
MyScale Blog
MyScale Blog
V
Visual Studio Blog
月光博客
月光博客
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
量子位
I
InfoQ
有赞技术团队
有赞技术团队
阮一峰的网络日志
阮一峰的网络日志
Jina AI
Jina AI
V
V2EX
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Blog — PlanetScale
Blog — PlanetScale
Last Week in AI
Last Week in AI
雷峰网
雷峰网
Stack Overflow Blog
Stack Overflow Blog
博客园 - Franky

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python)
OOPからSOLIDへ:一つの記事で知っておくべきすべて
Sanudin · 2026-05-25 · via DEV Community

🕐 約8分間の読み物

📝 この記事に関するメモ
この記事は、私のOOPとSOLIDの原則に関する個人的な学習メモに基づいて作成されました。メモをより読みやすく、役立つものにするため——私自身にも他の人にも——私はAIの助けを借りて、ブログ記事として発展させ、整理しました。アイデア、学習の旅、理解は私のものです;AIは執筆と提示の部分で助けをしました。


読みやすく、変更しやすいコードは偶然ではない。楽しいと感じるコードベースの背後には、すべてがどのように構成され、結びつくかを導くいくつかの考え方がある.

この記事では、その完全な旅について話す——OOPとは何か、オブジェクトがどのように相互に関連しているか、悪い設計とはどのようなものか、そして最終的には、すべてを統合するSOLIDの5つの原則.

始めよう。


第1部:OOPとは何か?

Object Oriented Programming (OOP) は、現実世界を反映するコードを書く方法です。長い指示のリストの代わりに、関連するデータと行動を オブジェクト にまとめます。

🤖 ロボットの玩具を想像してみてください。ロボットには プロパティがあります (色、高さ、バッテリー) と 行動 (歩く、話す、手を振る)。オブジェクト指向プログラミングにおいて、そのロボットはオブジェクトであり — 彼を構築するための設計図は class と呼ばれる。

二つの重要な用語:

  • Class — 設計図(テンプレート)
  • Object — その設計図から作られた実際のもの

オブジェクト指向の4つの柱

その機能
継承 子クラスは親クラスのプロパティと振る舞いを継承する
カプセル化 内部データは隠蔽され—外部からのアクセスは指定されたルートを通じてのみ可能
抽象化 内部の Kerumitan は隠され、必要なものだけが表示されます
多態性 同じアクションがオブジェクトによって異なる挙動を示す

第2部:オブジェクトどうしの関係性について

オブジェクトはそれぞれ独立して存在しません。彼らはつながり、協力し、互いに依存しており—そして 種類 は重要です.

アソシエーション

二つのオブジェクトが相互に認識し、相互作用できます。カーディナルリティには三つの種類があります.

  • 一対一 — 一人の人が一つのパスポート
  • 一対多 — 一人の教師、多くの生徒
  • 多対多 — 多くの生徒、多くの科目

アソシエーションにおいて、一つのオブジェクトが他のオブジェクトを「持つ」場合、その関係は以下のようになります:

  • 集約 (疎結合) — 子供のオブジェクトは親から独立して存在できます。バッグに本が入っているが、バッグが捨てられたとしても本はそのまま存在します。
  • 組成 (密結合) — 子供のオブジェクトは親の存在に依存しており、親が存在しないと存在できません。家に部屋がある;家が破壊されれば、部屋も一緒に消滅します。

依存関係

一時的な使用ベースの関係。一つのクラスが別のクラスを使用するが、永続的に保持しない。アソシエーションより弱い.

一般化 & 実現

  • 一般化 — 複数のクラスから共通の特性を一つのスーパークラスに引き上げる(継承)
  • 実現 — インターフェースを実装するクラスで、定義された契約を果たすことを約束しています

第3部:悪いデザインはどのようなものですか?

ルールを学ぶ前に、避けるべき点を理解することが重要です。ロバート・C・マーティンは、3つの悪いデザインの兆候を特定しました

🪨 柔軟性の欠如 — システムは変更が難しい。一つを触れると、多くの他のものも更新が必要になる。開発者は変更を行うのを恐れる。

🍪 弱さ (Kerapuhan) — 変更を行うと、予期せぬ場所でシステムが壊れる。支払いモジュールのバグを修正している途中で、突然メール通知が機能しなくなる。

🏗️ 固着 (Ketidakmampuan Dipindahkan) — 有用なコンポーネントは再利用できません。それらは環境と過度に摩耗しているため、取り除くのに最初から書き直すよりも時間がかかります。

これら三つには同じ根本的な原因があります: コンポーネント間の依存関係管理が悪い


第4章:SOLID

SOLIDは上記の問題を直接解決する五つの原則です。それぞれは特定の設計の失敗をターゲットとしています。


S — 単一責任の原則

「モジュールは一つの、そしてそれ以上の役割に対して責任を持つべきである。」

各クラスは正確に一つの理由で変更されるべきです — 1つの役割(1つのステークホルダーグループ)を担当します。

👨‍🍳 レストランの従業員が同時にシェフ、カスケール、セキュリティパーソン、そして食事の配達役を務めることは、起こりうる災害です。1つの役割の変更が他のすべての役割を妨げます。

クラスを分けなさい。1つのクラスあたり1つの責任.


O — 開放/閉鎖原則

「ソフトウェアのアーティファクトは追加するために公開され、変更するために閉じるべきです。」

新しい動作を追加するには、拡張する方法で — 既に動作している古いコードを編集するのではなく.

🔌 ストップコネクターは、新しいデバイスを接続するためにケーブルを外す必要がないことを可能にします。それがOCPの実践です。

ニーズが変わったら、古いコードの横に新しいコードを追加する——動作しているものを書き直さない.


L — リスコフの置換原則

「SがTのサブタイプである場合、T型のオブジェクトはS型のオブジェクトで置き換えることができ、プログラムの正しさを変えない。」

サブクラスは完全に置換可能であるべき は親クラスです。親が約束したすべてのことは、子が果たす必要があります.

🤖 親ロボットが料理できるなら、子ロボットも料理できるべきです — エラーを投げたり、何もせずに黙って待つことはできません.

もしサブクラスに空のメソッドがあるなら、実装のスタブを提供するか、「サポートされていません」と投げる — これはリスコフの置換則に違反します.


I — インターフェース分離の原則

「クライアントは、使わないインターフェースに依存させられない。」

大きすぎるインターフェースを作らず、クラスが不要なメソッドを実装するように強制しないように。インターフェースを小さく、より焦点を当てた部分に分割する。

🍴レストランの客に、ステーキのナイフ、スープのフォーク、スプーン、フォンデュのスプーンを与えないで、スープを注文した時だけ。

より小さいインターフェース = より狭い依存 = 位置特定の変更が継続します.


D — 依存性の逆転の原則

「高レベルモジュールは低レベルモジュールに依存しない。両者は抽象化に依存しなければならない。」

ビジネスロジックは特定の実装と直接関連しない。インターフェースとコミュニケーションしなければならない — 低レベルの詳細な実装で、そのインターフェースを実装しています.

🤖 スパタラをロボットの手に溶接しないでください。標準コネクターを手に与え、工具を交換可能にしてください.

これが、インフラストラクチャ(データベース、API、ファイルシステム)を変更してもビジネスロジックを触ることなくできる理由です.


簡潔なまとめ:SOLIDの概要

原則 解決すべき問題 鍵となる質問
SRP クラスが多くのことを行っている 「このクラスは複数のステークホルダーグループをサービスするか?」
OCP 古いコードを修正して機能を追加 「これは拡張として追加できそうか、変更としてではなく?」
LSP 損なわれた継承階層 「子孫が親を置き換えることで何も損なわれないか?」
ISP 肥大化したインターフェースと未使用のメソッド 「このクラスは不要な実装を強制されているか?」
DIP ビジネスロジックがインフラに結びついている 「高レベルのコードが、本来でない具体的なクラスに依存しているか?」

どこから始める?

初めてこれを実装するなら:

  1. SRPから始める — 「多くの仕事をしている」クラスを見つけ、分割する
  2. LSP違反のために継承を確認 — 空のメソッドはその警告の印
  3. インフラストラクチャの境界にインターフェースを追加 — それが実践におけるDIPです

これらの原則はチェックリストではありません。コードを書くたびにあなたが問いかけなければならない質問です


最初に公開された場所はsanudin.dev