1

モノポリー ゲームを設計しながら、OO の原則についても詳しく調べています。LSP (Liskov Substitution Principle) について読んでいて、それを完全に理解していないか、違反しているため、設計を変更する必要があることがわかりました。

(注記: このプロジェクトは個人的な楽しみのためのものなので、実際にはコードの保守性は気にしませんが、個人的な教育と LSP の理解を求めているだけです)

これまでに設計したものから始めましょう。

クラスBoardSpaceは抽象基本クラスであり、ボード上の「種類」のスペースごとに 1 つのサブクラスがあります。だから私は、、、PropertySpaceなどTaxSpaceを持っていますGoSpace

BoardSpaceスペースがボード上のどこにあるかに関する情報と抽象void Land()メソッドを持っているため、それぞれの異なるスペースに着陸したときに異なることを行うことができます。Land()そうすれば、現在のオブジェクトを呼び出しているときにBoardSpace、他のことを気にしたり考えたりする必要がなく、スペースがすべきことを行うだけです。私にとって、これは理にかなっており、実行可能なソリューションのように思えます。

Land()しかし、私が設計したように、これらの異なるオーバーライドされたメソッドはすべてまったく異なることを行うという点で、LSP に反しているようです。

または、LSP を誤解していますか? Land()「期待される」または「説明される」方法と関係がありますか?この場合、どれがスペースごとに完全に異なるので大丈夫ですか? それとも、それは確かに違反であり、再設計する必要がありますか?

副次的な質問: これは継承の「乱用」と見なされますか、それとも有効な使用と見なされますか?

4

1 に答える 1

1

LSP では、サブクラス メソッドがスーパークラスの規約に違反しない限り、スーパークラス メソッドとはまったく異なることを行っても問題ありません。つまり、実際には、その契約をどれだけ広くするかにかかっています。

プレイヤーBoardSpace.Land()の状態の変更のみが許可されている場合、サブクラスを着陸させることでプレイヤーがそれを購入できる (スペースの状態を変更する) 場合、問題が発生します。ただしLand()、着地プレイヤーと所有プレイヤーの状態、スペースの状態、およびカード デッキの状態を変更することが許可されている場合、LSP の違反はありません。

それでも、より正確に推論できる小さなメソッドに分割することをお勧めします。たとえば、着地したときにそのスペースで特別なアクション (カードを引くなど) が実行され、その後、プレイヤーとそのスペースの所有者 (他のプレイヤーまたは銀行) の間で取引が行われる場合があります。プレーヤーとカードデッキの現金とカードにのみ影響し、取引は関係する2つの当事者のお金とスペースの所有権にのみ影響します。

于 2012-01-27T04:45:57.093 に答える