最近、OOP(Java)には9つのルールがあると聞きました。私が知っているのは、抽象化、ポリモーフィズム、継承、カプセル化の 4 つだけです。OOP に関するその他のルールはありますか?
6 に答える
あなたが探しているのはPrinciples of Object-Oriented Design のようです。
Agile Software Development Principles, Patterns, and Practicesから要約。これらの原則は、ソフトウェア エンジニアリングにおける何十年にもわたる経験の成果です。それらは単一の考えの産物ではありませんが、多数のソフトウェア開発者と研究者の統合と執筆を表しています。これらはオブジェクト指向設計の原則としてここに示されていますが、実際にはソフトウェア エンジニアリングの長年の原則の特殊なケースです。
SRP 単一責任の原則クラスには、変更する理由が 1 つだけある必要があります。
OCP Open-Closed Principleソフトウェア エンティティ (クラス、パッケージ、メソッドなど) は、拡張に対してはオープンである必要がありますが、変更に対してはクローズされている必要があります。
LSP Liskov Substition Principleサブタイプは、それらの基本タイプを置換可能でなければなりません。
DIP 依存性逆転の原則抽象化は詳細に依存すべきではありません。詳細は抽象化に依存する必要があります。
ISP インターフェース分離の原則 クライアントは、使用しないメソッドに依存することを強制されるべきではありません。インターフェイスは、階層ではなく、クライアントに属します。
REP リリースと再利用の等価性の原則 再利用のグラニュールは、リリースのグラニュールです。
CCP 共通の閉鎖原則 パッケージ内のクラスは、同じ種類の変更に対してまとめて閉鎖する必要があります。クローズド パッケージに影響する変更は、そのパッケージ内のすべてのクラスに影響し、他のパッケージには影響しません。
CRP 共通の再利用の原則 パッケージ内のクラスは一緒に再利用されます。パッケージ内のクラスの 1 つを再利用すると、それらすべてが再利用されます。
ADP 非循環的依存関係の原則 依存関係グラフでサイクルを許可しません。
SDP 安定した依存関係の原則 安定性 の方向に依存します。
SAP The Stable Abstractions Principle パッケージは、安定しているのと同じくらい抽象的であるべきです。
ルールについてはわかりません。これらの言及はすべて、私にとってオブジェクト指向パラダイムのようなものです。私たちが従うアドバイスはほとんどありません。
- 関心の分離
- クラスごとの単一の責任
- 継承より合成を優先
- インターフェイスへのプログラミング
- さらに、ビリーボブが言及したすべてのことは、すでに
これらの OO の原則は、Head First Design Patternsから直接引用したものです。
- 変化するものをカプセル化する
- 実装ではなくインターフェイスへのプログラム
- 継承よりも構成を優先する
- クラスが変更する理由は 1 つだけにする必要があります (単一責任の原則) 。
- サブタイプは、そのベースを置換可能でなければなりません (リスコフ置換原理)
- クラスは、拡張に対してはオープンである必要がありますが、変更に対してはクローズされます (オープンクローズの原則)
Pragmatic Programmersによると、ルールは次のとおりです。
- 乾いた状態に保つ (同じことを繰り返さないでください)
- 恥ずかしがり屋に保つ(クラスの結束が高く、カップリングが低いことを確認してください)
- 相手のGUYに伝える(関心の分離)
これらはルールではなく概念です。実際にはルールはなく、決定するだけで、他のデザインよりも優れているデザインもあれば、他のデザインよりもはるかに優れているデザインもあります:-)
ただし、ガイドラインはたくさんあります :-) 言語固有のものもあれば (C++ にはたくさんあります)、オブジェクト指向固有のものもあります。リストするには多すぎます:-)
私の頭の上から、重要なものは次のとおりです。
- 疎結合、高凝集
- あなたがテストするテスト可能なクラスを書く
- 継承は慎重に使用し、意味のある場合にのみ使用します (構成を優先)
- オープン/クローズの原則に固執してみてください。
- (最重要) KISS
拡張して追加することがたくさんあります:-)
編集:追加する必要があります。あなたがリストしたルールはOOに固有のものではありません
OOP には「ルール」はありません。
言語をオブジェクト指向にするかどうかを決定する 4 つの言語プロパティがあります (これらは、質問に記載したものです)。
そこにある残りの資料はガイドラインです。私が読んだ中で最良/最も役立つガイドラインはGRASPです
提案の多くは素人 (非 CS 専門家) には容易に理解できません。GRASPは実用的で親しみやすいと思いました。
GRASP は、OO の最も重要な部分である (プログラマーではなくオブジェクトへの) 責任の割り当てをその名前に示しているため、素晴らしいと思います。
他のすべてが派生する最も重要な GRASP の 2 つの概念は、カップリングと結束です。これらの 2 つの概念/原則は、他のすべてのパターンとアプローチを推進します。
ところで - 私はちょうどあなたにインタビューしましたか? 質問の書き方を間違えました...