Монопольная игра - принцип LSP OO - PullRequest
1 голос
/ 27 января 2012

Я разрабатываю игру «Монополия», а также читаю больше о принципах ОО. Я читал о LSP (принцип подстановки Лискова) и обнаружил, что либо я не совсем понимаю его, либо нарушаю его и должен изменить свой дизайн.

(Только примечание: этот проект является личным и просто для удовольствия, поэтому на самом деле мне все равно, насколько понятен код, но я просто прошу личного обучения и понимания LSP)

Позвольте мне начать с того, что я разработал до сих пор:

Класс BoardSpace является абстрактным базовым классом, и на доске имеется один подкласс на «вид» пространства. Итак, у меня есть PropertySpace, TaxSpace, GoSpace и т. Д.

BoardSpace содержит информацию о том, где находится пространство на доске, а также абстрактный метод void Land(), так что каждое отдельное пространство может делать что-то свое при приземлении, как и должно быть. Таким образом, когда я вызываю Land() на текущем BoardSpace объекте, ему не нужно заботиться или думать о чем-то еще, а просто делать то, что должно делать пространство. Для меня это имеет смысл и звучит как реальное решение.

Но, похоже, это противоречит LSP в том, что все эти различные Land() переопределенные методы будут делать совершенно разные вещи, как я их разработал.

Или я неправильно понимаю LSP? Связано ли это с тем, как Land() «ожидается» или «описан» для работы? Что в этом случае совершенно разное для каждого пространства, так что все в порядке? Или это, конечно, нарушение, и я должен изменить его?

Дополнительный вопрос: будет ли это рассматриваться как «злоупотребление» наследством или его правильное использование?

1 Ответ

1 голос
/ 27 января 2012

Под LSP вполне нормально, чтобы методы подкласса делали совершенно разные вещи, чем методы суперкласса , если они не нарушают контракт суперкласса. Так что на самом деле все зависит от того, насколько широкими вы это сделаете договор.

Если бы BoardSpace.Land() было разрешено только изменить состояние игрока, то у вас возникла бы проблема, если бы посадка подкласса позволила игроку купить его (изменив состояние пространства). Однако если Land() разрешено изменять состояние приземляющего игрока и игрока-владельца, состояние пространства и состояние карточных колод, то нарушения LSP не происходит.

Тем не менее, это может быть хорошей практикой разбивать вещи на более мелкие методы, о которых вы можете рассуждать более точно. Например, пространство может иметь специальное действие, предпринимаемое при его приземлении (например, вытягивание карты), за которым следует транзакция между игроком и владельцем пространства (другим игроком или банком) с ограничением, что действие может влияют только на наличные деньги и карты игрока, а также на колоды карт, а транзакция может влиять только на деньги двух вовлеченных сторон и право собственности на пространство.

...