問題タブ [liskov-substitution-principle]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 「if else」/「instance of」が避けられない場合、ビジター パターンを使用する以外に、どのように設計を改善しますか?
純粋にセマンティックの継承であり、動作の継承ではないオブジェクト階層がある場合、実行時の型チェックを行うために、必然的に「instanceof」または「if/else」をあらゆる場所に記述する必要があります。
例えば
オブジェクト階層がある場合
これらのクラスに calculate() というメソッドがある場合、問題はありません。ポリモーフィズムを利用するだけで、この設計は LSP を満たします。
しかし、何らかの理由でこの calculate() メソッドをこの階層に追加したくない場合、これらのオブジェクトは純粋に単純なステートレス オブジェクトであり、意味を表すだけです。
次に、次のコードをどこにでも書く必要があります。
上記のコードは設計が悪いことを示しています。なぜなら、このコードをあらゆる場所に記述し、この設計は壊れやすく、後で変更するのが難しいからです。数値関数が制限されていて、関数の計算が 1 つの場所にある場合、複雑さによってはこれで問題ないと思います。
私がこれまでに知っていることは、上記のアプローチを解決するには、訪問者パターンを実装することだけが可能な方法であり、訪問者パターンを使用する以外に上記の設計を解決する方法はありますか?
ビジター パターンからわかる問題の 1 つは、ビジター パターンの accept メソッドが値を返さないことです。
ruby - Square と Rectangle の継承の何が問題になっていますか?
Square を Rectangle クラスの継承クラスにすることは悪い習慣であり、LSP (Liskov 代替原理) に違反しているとの記事を読んだことがあります。まだわかりません。Ruby でサンプル コードを作成しました。
何が問題なのか誰か教えてもらえますか?
java - LSP は、Ruby のような動的型付き言語でも意味がありますか?
Java の古典的な例を考えてみましょう
Javaのような静的型付き言語の親クラスのように、子クラスのオブジェクトを処理できる(型キャスト?)ことが要点だと思います:
Rectange rectange = new Square();
しかし、Rubyでは意味がないと思います.Rubyでも同じです:
次を使用して、オブジェクトのクラスをいつでも確認できます。
rectange.class
この場合、Ruby のコードが返される場合Square
のようには扱いませんRectange
。
Ruby のような動的型付け言語で LSP を適用するポイントを誰か説明してもらえますか?
SquareをRectangleの子にすることがどのような問題を引き起こす可能性があるかはまだわかりませんが。しかし今では 、次の方法を使用して、 LSPをバイオレット化するかどうかを確認することを学びます。
square
オブジェクトはSquare
クラスのインスタンスであり、オブジェクトrectangle
はクラスのインスタンスRectangle
です
これwidth=
は両方のメソッドです
width=
inをinsquare
に置き換えることはできませんwidth=
rectangle
「正方形」で定義されているように高さを設定しないためです。
この考え方は間違っていますか?
また、Rectangle
クラスで 'width=' メソッドのバイオレットを使用して、この問題を分析することも学びました。
width=
「Rectangle」クラスの
前提条件:@width
そして、@height
何らかの価値があります。
事後条件:@width
新しい値に変更し、その@height
ままにしておきます。
Square
クラスの「幅=」
前提条件:上と同じ
事後条件: '@width' を新しい値に@height
変更、新しい値に変更
原則に従って:それ以上は要求せず、それ以下は約束しない
が@height
変更されたため、約束が果たされないため、継承できません
を使用してこの問題を分析する方法について、誰かがアドバイスをくれますDBC
か?
java - Java で 3 次元の Liskov マップを作成するにはどうすればよいですか?
マップを別のマップに入れようとしています。
しかし、私はこれを受け取ります:
Map> 型のメソッド put(String, capture#1-of ? extends Map) は、引数 (String, Map) には適用されません。
Map<String,String>
と同じではありません? extends Map<String,String>
か?
oop - これでリスコフ置換の正四角形違反は解決しますか?
私は SOLID 設計原則に非常に慣れていません。理解に問題があったことの1つは、リスコフ置換原理違反の「四角形」の例です。Square の Height/Width セッターが Rectangle のものをオーバーライドする必要があるのはなぜですか? ポリモーフィズムが存在する場合、これがまさに問題の原因ではありませんか?
これを削除しても問題は解決しませんか?
出力は予想どおり 30 です。