2013-06-27 1 views
2

Je suis en train de faire un simple programme de liste de tâches en utilisant le modèle MVC, et j'ai donc une classe de modèle pour le Notebook. Cependant, quelque chose se sent "off" car il a un très faible nombre de membres.Un faible nombre de membres dans une classe est-il considéré comme une odeur de code?

Le bloc-notes est composé de catégories, composées de listes de tâches, composées d'éléments. Ce que je ne peux pas placer est si c'est une analyse de cas pauvre (par exemple il y a plus de membres et responsabilités je leur manque juste ..) ou peut-être une odeur de code que la classe n'est pas nécessaire (dans ce cas je suis Je ne sais pas quoi faire car je pourrais juste avoir une liste de catégories dans ce contrôleur, mais alors je n'ai pas une entité de cahier modélisée qui semble mal aussi).

Ci-dessous est la classe très simple je:

class Notebook 
{ 
    private String title; 
    private List<Category> categories; 

    public Notebook(String title, List<Category> categories) 
    { 
    } 

    public void setCategories(List<Category> categories) 
    { 
    } 

    public List<Category> getCategories() 
    { 
    } 
} 

J'ai souvent cette question où il se sent comme je fais des cours pour le plaisir de le faire et ils ont un nombre très de membres/responsabilités, donc il serait bon de savoir si je souligne sans raison ou pas.

+1

En règle générale, les moins de variables membres mieux! Il existe une école de pensée selon laquelle tous les objets appartiennent à l'une des deux catégories suivantes: ceux qui gèrent la durée de vie d'une seule valeur et ceux qui gèrent l'interaction de deux valeurs. Suivre ce principe à l'extrême se traduirait par des objets n'ayant jamais plus de 2 variables membres. – MattDavey

Répondre

1

Pas nécessairement, il y a le concept dans la conception de domaine de ce qu'on appelle un «type standard». Ce qui est vraiment une primitive de base enveloppée dans une classe d'objet. L'idée est que la primitive ne contient aucune information sur les informations qu'elle contient, c'est juste une chaîne/int/peu importe. Donc, en disant un objet qui entoure la primitive et en s'assurant qu'elle est toujours valide, on s'assure que l'objet a une signification bien au-delà de la primitive qu'il contient par exemple. Un nom n'est pas seulement une chaîne, c'est un nom.

Voici un exemple tiré des commentaires de Velocity

public class Velocity 
{ 
    private readonly decimal _velocityInKPH; 

    public static Velocity VelocityFromMPH(decimal mph) 
    { 
     return new Velocity(toKph(mph)); 
    } 

    private Velocity(decimal kph) 
    { 
     this._velocityInKPH = kph; 
    } 

    public decimal Kph 
    { 
     get{ return this._velocityInKPH; } 
    } 

    public decimal Mph 
    { 
     get{ return toMph(this._velocityInKPH); } 
    } 

    // equals addition subtraction operators etc. 

    private static decimal ToMph(decimal kph){ // conversion code } 
    private static decimal ToKph(decimal mph){ // conversion code } 
} 
+0

+1 [objet gymnastique] (https://www.google.co.uk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CC8QFjAA&url=http%3A%2F%2Fwww.xpteam.com% 2Fjeff% 2Frits% 2Fobjectcalisthenics.rtf & ei = pnbMUZioMaPQ7AbxhoHIDw & usg = AFQjCNFNSHFqJKUMFLkjtH9QKMQILPfGaA & sig2 = jSy99GkMi1sRQ1UId_djmA & bvm = bv.48340889, bs.1, d.d2k) fait un excellent travail d'explication de ce concept dans Rule3: Enveloppe toutes les primitives et les chaînes. – MattDavey

+0

+1 de plus. Les types forts empêchent les erreurs lorsque vous essayez d'utiliser deux valeurs incompatibles partageant un type primitif commun. Par exemple, si vous avez "int rowsPerScreen;" et "int milesPerHour;", une déclaration comme "distance = rowsPerScreen * milesPerHour;" est syntaxiquement et mathématiquement valide, mais sémantiquement dénué de sens. Si vous les avez fortement typés comme "ScreenRows rowsPerScreen;" et "Velocity milesPerHour"; vous ne pourriez jamais faire cette erreur. –

Questions connexes