私はSOLIDやDRYなどのソフトウェア設計原則の大ファンです。オブジェクト指向ソフトウェアの設計には、他にどのような原則が存在しますか?
ノート。「コードにコメントしてください」のような答えを探しているのではなく、代わりにUncle Bobで議論されているようなオブジェクト指向の設計原則を探しています。
私はSOLIDやDRYなどのソフトウェア設計原則の大ファンです。オブジェクト指向ソフトウェアの設計には、他にどのような原則が存在しますか?
ノート。「コードにコメントしてください」のような答えを探しているのではなく、代わりにUncle Bobで議論されているようなオブジェクト指向の設計原則を探しています。
GRASPパターン。はい、それらはかなり些細なことのようです。他のより複雑なパターンが示すコア品質への蒸留のようなものです。
継承よりも構成を選択したのは 1 つです。
多くの人、特に OO を初めて使用する人は、合成を使用することだけが本当に必要なときに、クラスの拡張を開始します。自問自答してみると、新しいクラス B はクラス A ですか? そうでない場合は、延長しないでください。
たとえば、Person
クラス、Car
クラスがあり、クラスという名前の新しいクラスを作成したいとしDrivenCar
ます。単純な実装は次のようになります (多重継承があるとしましょう)
class DrivenCar extends Person, Car { ... }
DrivenCar は Person のタイプですか? いいえ、Person を拡張するべきではありません。DrivenCar は車ですか? はい、拡張することは理にかなっています
コンポジションを使用すると、実装は次のようになります
class DrivenCar extends Car {
private Person driver;
}
API の拡張が予想される場合は、Interface の代わりに Abstract クラスを使用します。Interface に新しいメソッドを追加するには、それを実装するすべてのクラスを変更する必要があります。