2010-04-07 16 views
2

Je crée un jeu vidéo. Il a des caractères & Articles. Puisque je veux les caractères & Les articles à chacun ont un nom, devrais-je faire une autre classe appelée NamedObjects avec juste un champ de nom et avoir des caractères & Les articles prolongent cela? Ou est-ce aller trop loin?Ruby Abstract Class Design

Répondre

3

Pour quelque chose d'aussi simple que l'attribut name, il peut ne pas valoir la peine d'écrire du code modulaire, parce que la seule ligne que vous devrez peut-être est:

attr_accessor :name 

Bien sûr, si vous prévoyez que les choses named partager plus de fonctionnalités à l'avenir, votre préoccupation est tout à fait valable. Plutôt que d'utiliser l'héritage, il est préférable d'utiliser des modules Ruby:

module Nameable 
    attr_accessor :name 

    # To be expanded. 
end 

class Item 
    include Nameable 
end 

class Character 
    include Nameable 
end 
+0

Amen à cela. Utiliser mixins empêcherait également le cas assez commun quand vous avez des classes 'A',' B', et 'C': disons' A' et 'B' partagent la fonctionnalité commune' F'', et 'A' et' C' fonctionnalité 'F'''. Avec l'héritage de classe, vous êtes bloqué ici. –

+0

@Mladen Jablanović: L'héritage Eiffel gérerait très bien cette situation, même si je suis d'accord que les mixins sont souvent une meilleure solution de toute façon. – Arkku

+0

+1. Vous pourriez peut-être étendre cette réponse avec quelques méthodes dans le module. (Je ne peux pas penser à moi-même ATM ...) –

2

Si tout ce qu'ils partagent est un nom, c'est probablement trop.

2

Les classes doivent en général partager la classe de base lorsqu'elles ont le même comportement, et non les mêmes données. OOP devrait toujours être sur le comportement. Vous devriez également penser à/étudier le Liskov substitution principle lors de la création de classes de base.

+0

Comment le concept de accesseurs d'attributs (qui sera probablement utilisé pour la mise en œuvre 'name' dans ce cas) s'inscrit dans ce comportement/règle de données? BTW, pouvez-vous clarifier la relation du principe de Liskov avec la question ici, je ne vois pas? –

0

Avez-vous déjà besoin de faire une boucle sur un groupe de NamedObjects et d'afficher le nom? Si c'est le cas, vous avez besoin de la classe NamedObjects. Si vous ne le faites pas, vous ne ...

Vous ne pouvez pas faire une erreur catastrophique sur un si petit problème de toute façon: Si vous ne faites pas une classe de base pour le nom et vous en aurez besoin plus tard, vous Je vais juste restructurer vos cours plus tard, pas grave. Si vous ajoutez la classe de base et n'en avez pas réellement besoin, ce n'est pas un gros problème, elle peut être ignorée en toute sécurité.

1

En Java, je créerais l'interface NamedObject comme vous l'avez dit. Cependant, Ruby est un langage dactylographié dynamique. Il n'y a pas d'interfaces. Il suffit donc de définir un attribut de nom et de l'utiliser là où vous en avez besoin.