問題タブ [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.

0 投票する
3 に答える
713 参照

java - 「if else」/「instance of」が避けられない場合、ビジター パターンを使用する以外に、どのように設計を改善しますか?

純粋にセマンティックの継承であり、動作の継承ではないオブジェクト階層がある場合、実行時の型チェックを行うために、必然的に「instanceof」または「if/else」をあらゆる場所に記述する必要があります。

例えば

オブジェクト階層がある場合

これらのクラスに calculate() というメソッドがある場合、問題はありません。ポリモーフィズムを利用するだけで、この設計は LSP を満たします。

しかし、何らかの理由でこの calculate() メソッドをこの階層に追加したくない場合、これらのオブジェクトは純粋に単純なステートレス オブジェクトであり、意味を表すだけです。

次に、次のコードをどこにでも書く必要があります。

上記のコードは設計が悪いことを示しています。なぜなら、このコードをあらゆる場所に記述し、この設計は壊れやすく、後で変更するのが難しいからです。数値関数が制限されていて、関数の計算が 1 つの場所にある場合、複雑さによってはこれで問題ないと思います。

私がこれまでに知っていることは、上記のアプローチを解決するには、訪問者パターンを実装することだけが可能な方法であり、訪問者パターンを使用する以外に上記の設計を解決する方法はありますか?

ビジター パターンからわかる問題の 1 つは、ビジター パターンの accept メソッドが値を返さないことです。

0 投票する
3 に答える
3075 参照

ruby - Square と Rectangle の継承の何が問題になっていますか?

Square を Rectangle クラスの継承クラスにすることは悪い習慣であり、LSP (Liskov 代替原理) に違反しているとの記事を読んだことがあります。まだわかりません。Ruby でサンプル コードを作成しました。

何が問題なのか誰か教えてもらえますか?

0 投票する
1 に答える
309 参照

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か?

0 投票する
2 に答える
1411 参照

java - Java で 3 次元の Liskov マップを作成するにはどうすればよいですか?

マップを別のマップに入れようとしています。

しかし、私はこれを受け取ります:

Map> 型のメソッド put(String, capture#1-of ? extends Map) は、引数 (String, Map) には適用されません。

Map<String,String>と同じではありません? extends Map<String,String>か?

0 投票する
2 に答える
2349 参照

oop - これでリスコフ置換の正四角形違反は解決しますか?

私は SOLID 設計原則に非常に慣れていません。理解に問題があったことの1つは、リスコフ置換原理違反の「四角形」の例です。Square の Height/Width セッターが Rectangle のものをオーバーライドする必要があるのはなぜですか? ポリモーフィズムが存在する場合、これがまさに問題の原因ではありませんか?

これを削除しても問題は解決しませんか?

出力は予想どおり 30 です。