Question

Je conçois un jeu de monopole tout en lisant plus sur les principes OO. Je lisais sur le LSP (principe de substitution de Liskov) et j'ai constaté que soit je ne le comprenais pas pleinement ou que je le violais et je devrais changer ma conception.

(Juste une note: ce projet est personnel et juste pour le plaisir, donc je me fiche de la maintenable du code, mais je demande simplement l'éducation personnelle et la compréhension du LSP)

Permettez-moi de commencer par ce que j'ai conçu jusqu'à présent:

Classer BoardSpace est une classe de base abstraite, et il y a une sous-classe par "type" d'espace sur la planche. Donc j'ai PropertySpace, TaxSpace, GoSpace, etc.

BoardSpace a des informations sur l'endroit où se trouve l'espace sur la planche, et aussi un résumé void Land() Méthode, de sorte que chaque espace différent peut faire quelque chose de différent lorsqu'il est atterri, comme il se doit. De cette façon, quand j'appelle Land() sur le courant BoardSpace Objet, il n'a pas besoin de se soucier ou de penser à autre chose et de faire ce que l'espace doit faire. Pour moi, cela a du sens et ressemble à une solution réalisable.

Mais il semble aller à l'encontre du LSP en ce que tous ces différents Land() Les méthodes remplacées feront des choses entièrement différentes, comme je les ai conçues pour le faire.

Ou suis-je mal compris le LSP? Cela a-t-il plus à voir avec le chemin Land() Est-ce que "attendu" ou "décrit" fonctionne-t-il? Lequel dans ce cas est complètement différent par espace, donc ça va? Ou est-ce certainement une violation et je devrais la repenser?

Question secondaire: cela serait-il considéré comme un «abus» d'héritage ou une bonne utilisation de celui-ci?

Était-ce utile?

La solution

Sous LSP, il est très bien que les méthodes de sous-classe fassent des choses complètement différentes des superclass Tant qu'ils ne violent pas le contrat de la superclasse. Donc, tout cela dépend de la largeur de ce contrat.

Si BoardSpace.Land() n'était autorisé à changer l'état du joueur, alors vous auriez un problème si l'atterrissage d'une sous-classe permettait au joueur de l'acheter (modifiant l'état de l'espace). Si, toutefois Land() est autorisé à changer l'état du joueur d'atterrissage et le joueur propriétaire, l'état de l'espace et l'état des ponts de cartes, alors il n'y a pas de violation du LSP.

Pourtant, il pourrait être une bonne pratique de diviser les choses en méthodes plus petites que vous pouvez raisonner plus exactement. Par exemple, l'espace peut avoir une mesure spéciale prise sur lui lorsque vous atterrissez (comme le dessin d'une carte), suivie d'une transaction entre le joueur et le propriétaire de l'espace (autre joueur ou banque), avec la contrainte que l'action peut n'affecte que l'argent et les cartes du joueur et des ponts de carte, et la transaction ne peut affecter que l'argent des deux parties impliquées et la propriété de l'espace.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top