はの関係 — でモデル化されます( )。 はの関係 — でモデル化されます( を)。正しい方を選ぶことはコア・モデリング判断です。
はの関係 — でモデル化されます( )。 はの関係 — でモデル化されます( を)。正しい方を選ぶことはコア・モデリング判断です。
CarVehicleCarEngine// IS-A → inheritance
class Vehicle { void move() {} }
class Car extends Vehicle { } // a Car IS A Vehicle
// HAS-A → composition
class Engine { void start() {} }
class Car2 {
private Engine engine = new Engine(); // a Car HAS AN Engine
void start() { engine.start(); } // delegate to the part
}
X は Y の一種なのか、それとも X は Y を持つ/使うのか、と問い掛けてください。
A Dog IS-A Animal → inheritance ✅
A Car HAS-A Engine → composition ✅
A Square IS-A Shape → inheritance ✅
A Manager HAS Employees → composition (a list) ✅
A Stack HAS-A list (not IS-A) → composition (see earlier pitfall) ✅
人々はコード再利用するためにinheritanceに頼ることがあります。関係が本当はhas-aでも。サブクラスを至る所でベースの代わりに置き換えることができないなら、is-aではない可能性があります — compositionを使いましょう。
この区別は「compositionをinheritanceより優先する」の背後にある実践的な決定ルールです。コード行数を節約できる関係ではなく、真実の関係を選びましょう。
これを正しくすることで階層構造が浅く正直に保たれ、サブタイプが親の代わりに立つことができないLiskov違反を防ぎます。