2009-11-02 5 views
1

J'ai un certain nombre de classes qui sont tous liés sur le plan conceptuel, mais un peu plus, donc au Niveau de détail que d'autres. Par exemple, ces trois classes ont des propriétés presque identiques (bien que les fonctions membres varient):Demande de Creational Conception/Motif Suggestion

public class RelatedA : IRelatedType 
{ 
    public string Name { get; set; } 
    public string Value { get; set; } 
    public DateTime Stamp { get; set; } 
} 

public class RelatedB : IRelatedType 
{ 
    public string Name { get; set; } 
    public string Value { get; set; } 
    public DateTime Stamp { get; set; } 
} 

public class RelatedC : IRelatedType 
{ 
    public string Name { get; set; } 
    public string Value { get; set; } 
    public DateTime Stamp { get; set; } 
    public int Special { get; set; } 
} 

Il y a deux autres classes qui sont conceptuellement liés au 3 ci-dessus, mais peut être un peu différente sage mise en œuvre :

public class RelatedD : IRelatedType 
{ 
    public string Name { get; set; } 
    public string Statement { get; set; } 
} 

public class RelatedE : IRelatedType 
{ 
    public string Name { get; set; } 
    public string Statement { get; set; } 
    public bool IsNew { get; set; } 
} 

Les instances de ceux-ci peuvent être créés par une usine basée sur une sorte de « type » valeur énumérée. Le problème est que plus tard lorsque ces objets sont utilisés (dans une couche d'affaires, par exemple), il pourrait y avoir beaucoup de code comme ceci:

IRelatedType theObject = TheFactory.CreateObject(SomeEnum.SomeValue); 

if (theObject is RelatedC) 
{ 
    RelatedC cObject = theObject as RelatedC; 
    specialVal = cObject.Special; 
} 
else if (theObject is RelatedD) 
{ 
    RelatedD dObject = theObject as RelatedD; 
    statementVal = dObject.Statement; 
} 
else if (theObject is RelatedE) 
{ 
    RelatedE eObject = theObject as RelatedE; 
    statementVal = eObject.Statement; 
    isNewVal = eObject.IsNew; 
} 

Cela pourrait se répéter dans de nombreux endroits. Y a-t-il une meilleure approche de la conception que je devrais utiliser (il doit y avoir)?

Répondre

1

Vous pouvez essayer de tenir compte des différences dans les classes séparées qui sont ensuite fournis ainsi par exemple:

IRelatedType theObject = TheFactory.CreateObject(SomeEnum.SomeValue); 
RelatedTypeHelper theHelper=TheFactory.CreateHelper(theObject); 
theHelper.DoSpecialThing(theObject); 

Maintenant, vous ne devez avoir tous les blocs si d'autre, et si vous ajoutez un nouveau type ce qui nécessite une nouvelle manipulation, vous venez de mettre en place une nouvelle aide mettre en œuvre les pièces nécessaires et vous devriez être bon à faire. L'aide devrait aider à documenter ce processus.

Je voudrais aussi demander pourquoi une seule méthode aurait une telle mise en œuvre différente pour specialVal et StatementVal pourrait être votre échantillon, mais il me rend curieux ce que vous faites vraiment ici. pouvez-vous simplifier les choses en prenant du recul et en remettant en question le fait que ces éléments soient inclus dans cette hiérarchie spécifique.