2011-06-09 5 views
5

Cela peut sembler un peu stupide, mais je suis toujours curieux de savoir ce que la communauté pense.
J'ai donc un WebService retournant une classe UpdateInfo.
Considérons maintenant les définitions suivantesC# type design Question

public enum TTCFileType 
{ 
    API = 0, 
    BOOKMARK, 
    TICKMARK 
} 
public class FileUpdateInfo 
{ 
    public string FileName; 
    public string FileDownLoadURI; 
    public TTCFileType FileType; 
} 
public class UpdateInfo 
{ 
    public FileUpdateInfo fuInfo; 
    //Other 
} 

Voici la question, si le TTCFileType a la valeur TICKMARK alors je besoin d'un autre type ENUM à savoir Tickmark (les exigences logiques de biz cette information). Je me demande quelle est la meilleure façon de représenter cela. Je ne veux pas une signature de méthode où j'ai quelque chose comme

UpdateMethod(UpdateInfo ui, TickMarkType tt) 

où j'examinerai tt si ui.fuInfo.FileType == TTCFileType.TICKMARK
Je suppose que je suis en train de trouver un moyen élegante au moins pour représenter l'exigence conditionnelle pour obtenir le deuxième morceau de informations sur (à bien des égards cela rappelle tellement VARIANTS, si var.VT == VT_ [truc] puis utiliser vt. [thingy] et oui je sais comment les développeurs # c se sentent sur les syndicats :-)
Quoi qu'il en soit curieux s'il y a un astucieux façon de le faire Merci

+0

Vous pouvez utiliser un 'Nullable ' Alias ​​'TickMarkType?', Alors vous pourriez passer null au lieu d'un 'TickMarkType 'aléatoire s'il ne doit pas être utilisé. Bien que je ne suis pas sûr que ce soit exactement ce que vous recherchez. –

+0

hmm pas sûr si c'est ce que je veux, à bien des égards comme je l'ai dit je l'ai trouvé intéressant ce n'est pas un problème de type fusée science je pourrais juste recourir à dire oui vous devrez prendre un type dont la valeur ignore à moins que l'autre paramètre ne soit égal à quelque chose.WIN32 API sont remplis avec des choses comme ça si dwParamthing est -1 alors pszPointer sera ignoré et ainsi de suite et donc ce n'est pas faux de faire cela se demandait s'il y a quelque chose de mieux – Rahul

Répondre

0

Idéalement, vous avez besoin de deux structure supplémentaire (s)

public enum TickmarkType 
{ 
    TYPE1=0, 
    TYPE2 
} 

public class TickMarkFileUpdateInfo : FileUpdateInfo 
{ 
    public TickmarkType type; 
} 

Et puis lire sur polymorphism in web services

1

Il suffit d'inclure TickMarkType champ à FileUpdateInfo classe?

+0

yup qui semble plus simple mais gaspillée si la première valeur enum n'est pas TICKMARK. Je sais que je sais que le gaspillage n'est pas grand chose :-). En toute honnêteté c'est probablement ce que je vais faire :-) – Rahul

0

Stockez la valeur enum comme int. Ajoutez un peu de décalage à la valeur de votre deuxième énumération (par exemple, 1000) de sorte que si la valeur provient de la première énumération, elle est 0..2 et si elle provient de la deuxième énumération, elle est 1000.1010 ou autre. Ensuite, vous pouvez définir 2 propriétés, une qui renvoie un TTCFileType Nullable et l'autre qui renvoie un TickType Nullable, pour lire et écrire les valeurs dans le champ int.

+0

hmmm intéressant très intéressant. Je crois que c'est plutôt intelligent – Rahul

1

Je serais tenté d'aller avec quelque chose comme:

public enum TTCFileType 
{ 
    API = 0, 
    BOOKMARK, 
    TICKMARK_TYPE1 = 100, 
    TICKMARK_TYPE2 = 101, 
    TICKMARK_TYPE3 = 102 
} 

et ainsi de suite. Selon le nombre et la facilité de gestion, vous vous sentirez dans le contexte plus large de votre code.

+0

Je voudrais aussi faire quelque chose comme ça. Nous avons de grandes énumérations pour le type d'entrée de journal - et nous les classons comme ci-dessus (bien que dans des incréments de 1000, 2000, 3000) – christofr

0

Il semble que vous essayez d'utiliser uniquement des structures de données, lorsque vous utilisez des fonctionnalités OO (telles que l'héritage) peut vous aider. Peut-être que cet exemple de code vous donne quelques idées:

public class Update 
{ 
    // ... ? 
} 

public class FileUpdate : Update 
{ 
    public virtual string Name { get; set; } 
    public virtual string DownloadUri { get; set; } 
    public virtual bool IsTickMarked { get; set; } 
} 

public class ApiFileUpdate : FileUpdate 
{ 
    // ... 
} 

public class BookmarkFileUpdate : FileUpdate 
{ 
    // ... 
} 

Vous pouvez toujours les sérialiser, compte tenu des attributs de sérialisation appropriés. En fait, vous pouvez définir des méthodes (potentiellement virtuelles) sur ces différentes classes et les utiliser réellement pour implémenter votre programme.

La ségrégation excessive de vos données et de votre code est connue sous le nom Anemic Domain Model Anti-Pattern.