2009-05-13 5 views
1

J'ai une classe Customer qui a une propriété List <string> Roles. La plupart du temps je veux accéder à cette propriété comme une liste de chaînes, mais à l'occasion je veux le voir comme une liste délimitée par des virgules.en utilisant deux propriétés publiques différentes pour "obtenir" la même variable privée avec différents types de retour

Je pourrais certainement faire cela dans une nouvelle méthode, et si je prévoyais vouloir obtenir la valeur de la variable dans différents formats (délimité par des virgules, délimité par des tabulations, & ct), je le ferais certainement. Cependant, je jongle avec l'idée d'utiliser deux propriétés différentes pour accéder à la valeur de la variable, quelque chose le long des lignes de

public List<string> Roles 
{ 
    get { return this._Roles; } 
    set { this._Roles = value; } 
} 

et

public string RolesToString 
{ 
    get { do some work here to comma-delimit the list; } 
} 

Essentiellement, je veux remplacer la méthode ToString() de cette liste particulière. Y a-t-il des raisons impérieuses de faire 1 par rapport à l'autre? L'utilisation de deux propriétés différentes pour renvoyer la même valeur de variable est-elle suffisamment inhabituelle pour provoquer des drapeaux rouges?

Répondre

10

Je ferais de votre seconde "propriété" une méthode. Il effectue un traitement supplémentaire sur votre liste et retourne quelque chose qui n'est pas une "propriété" directe de l'objet, mais plutôt une version traitée de la propriété de l'objet. Cela semble être une méthode raisonnable.

Ma préférence serait:

public List<string> Roles 
{ 
    get { return this._Roles; } 
    set { this._Roles = value; } 
} 

public string GetRolesAsString() 
{ 
    // Do processing on Roles 
} 
+0

Cette logique est parfaitement logique, merci! – cori

3

Comme Reed dit qu'il devrait probablement être une méthode, mais c'est kindof subjective.

Notez que vous n'avez pas besoin beaucoup de code pour le faire - juste un appel à rejoindre()

public string RolesAsString() 
{ 
    return String.Join(", ", this._Roles); 
} 

Et étant donné que la chaîne d'assemblage est si facile dans .NET, avez-vous vraiment besoin d'une méthode/propriété pour cela?

+0

c'est exactement le code auquel je pensais. Je pense que je vais aller avec la méthode - semble plus standard, et en gardant à l'esprit YAGNI, il n'est pas inconcevable que je puisse en avoir besoin dans un format différent plus tard, et très peu de complexité pour l'ajouter maintenant dans une méthode. Je suis dans .Net 2, donc c'est un petit peu plus dur que ça - tout comme je peux dire que je dois ToArray() d'abord la liste. Ceci est essentiellement une classe de bibliothèque, donc je suis intéressé à rendre les appels de code client aussi simples que possible, donc la méthode/propriété. – cori

0

Je n'ai aucun problème avec ce que vous proposez. Sauf que je le nommerais RolesString.

Mais ... Pourquoi seulement un getter? Si je peux définir la propriété Roles, pourquoi ne pas définir la propriété RolesString?

Un traitement supplémentaire ne signifie pas nécessairement qu'une méthode doit être utilisée.

+1

pourquoi pas de setter? Yagni –

+0

Je suppose que ma pensée était que la lecture de la valeur de différentes propriétés serait inoffensive, mais qu'il est possible de l'écrire à partir de deux propriétés différentes pourrait être potentiellement dangereux. De plus, l'objet sous-jacent auquel j'écris (un SAP BAPI) a besoin de la liste complète quand je le mets à jour, et 90% de la gestion sera d'ajouter un seul rôle, donc utiliser Roles.Add (string) est le meilleur interface. – cori

+0

ce sont des points justes! – Cheeso

Questions connexes