タグ付けされた質問 「open-closed-principle」

2
このクラスを開閉するのが難しい
これが私の問題です。ゲームパッド、よくレースする、ジョイスティックなど、さまざまなHIDデバイスからの入力を読みたいのですが、ほとんどすべてのゲームコントローラです。問題は、それらすべてに異なる入力があることです。 ゲームパッドにはボタン、スイッチ、スティックがあり、レースウェルにはギアスティックが付いている場合があります。これらのさまざまなコンポーネントをすべて3つに抽象化して、可能なすべての組み合わせを持つ基本クラスを作成するのではなく、 abstract class Device { public Buttons Buttons; public Axes Axes; public Switches Switches; public GearSticks GearSticks; //many more } 私は今持つことができます: abstract class Device { public Buttons Buttons; //on or off public Axes Axes; //range [-100%:100%] public Switches Switches; //multiple states } すべての入力を3種類に抽象化できるため、すべての具体的な実装を介して拡張に対して開かれている間、クラスを閉じたままにできるため、最初はこれに満足しました。 しかしその後、私は自分自身にかかわらず、私は避けられないが遅延していた場合にどのような?ある日Deviceクラスに別のフィールドを追加する必要がある場合はどうなりますか?トラックボールのようなものはサポートしていません! このクラスを将来証明できる方法はありますか?私がそれを見る方法では、私はこのようなものになるでしょう: public Device1 : Device …

2
Liskovの置換の原則:サブタイプに、型には存在しない追加の動作が実装されている場合、このLSPの違反ですか?
私はより良く、よりクリーンなコードを書くために、SOLIDの原則について学んでいます。この点で、LSPは適切に把握するのが少し難しいことがわかっています。 私の疑問は、サブタイプSに余分なメソッドがあり、タイプTになかった場合、これは常にLSPの違反になるのでしょうか?はいの場合、どのようにextend私のクラスを行うのですか? たとえば、Birdタイプがあるとしましょう。そして、そのサブタイプはEagleおよびHumming Birdです。現在、両方のサブタイプには、としていくつかの共通の動作がありBirdます。しかし、Eagle(一般的なBirdタイプには存在しない)優れた略奪行動もあるので、それを使用したい。したがって、今はこれを行うことができません: Bird bird = new Eagle(); それで、Eagleそれらの追加の振る舞いを与えることはLSPを壊していますか? はいの場合、それはLSP違反を引き起こすため、クラスを拡張できないことを意味しますか? class Eagle extends Bird { //we are extending Bird since Eagle has some extra behavior also } クラスの拡張は、Open / Closed原則に従って許可する必要がありますか? よろしくお願いします!はっきりとわかるように、LSPは私を他のものと同じように混乱させています。 編集:このSOの回答を参照してください。この場合Carも、のような追加の動作がある場合ChangeGear、LSPに違反します。では、LSPに違反せずにクラスを拡張するにはどうすればよいでしょうか。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.