J'ai une classe C # qui représente un type de contenu dans un système de gestion de contenu Web.
Nous avons un champ qui permet à un éditeur de contenu Web d'entrer un modèle HTML pour la façon dont l'objet est affiché. Il utilise essentiellement la syntaxe du guidon pour remplacer les valeurs de propriété d'objet dans la chaîne HTML:
<h1>{{Title}}</h1><p>{{Message}}</p>
Du point de vue de la conception de classe, dois-je exposer la chaîne HTML formatée (avec substitution) en tant que propriété ou méthode ?
Exemple en tant que propriété:
public class Example
{
private string _template;
public string Title { get; set; }
public string Message { get; set; }
public string Html
{
get
{
return this.ToHtml();
}
protected set { }
}
public Example(Content content)
{
this.Title = content.GetValue("title") as string;
this.Message = content.GetValue("message") as string;
_template = content.GetValue("template") as string;
}
private string ToHtml()
{
// Perform substitution and return formatted string.
}
}
Exemple comme méthode:
public class Example
{
private string _template;
public string Title { get; set; }
public string Message { get; set; }
public Example(Content content)
{
this.Title = content.GetValue("title") as string;
this.Message = content.GetValue("message") as string;
_template = content.GetValue("template") as string;
}
public string ToHtml()
{
// Perform substitution and return formatted string.
}
}
Je ne suis pas sûr du point de vue de la conception que cela fasse une différence ou y a-t-il des raisons pour lesquelles une approche est meilleure que l'autre?
c#
design-patterns
class-design
methods
properties
Charles Wesley
la source
la source
Réponses:
MISE À JOUR: Cette question a fait l'objet de mon blog en mai 2014 . Merci pour la grande question!
Pour ajouter à la réponse de Robert Harvey : une propriété devrait être:
logiquement une propriété de la classe, la façon dont disent sa couleur ou année ou modèle sont les propriétés d'une voiture.
pas plus, disons, dix fois plus lentement à calculer que d'aller chercher dans un champ.
quelque chose qui ne vous dérange pas d'être calculé lors du débogage. Le débogueur VS calcule automatiquement les propriétés.
incapable d'échouer. Les accesseurs doivent toujours renvoyer une valeur, quel que soit l'état de l'objet.
Je ne pense pas que votre
Html
propriété proposée touche à tout cela . N'en faites pas une propriété à moins qu'elle ne les frappe tous .la source
ToHtml
est correctement une méthode, comme vous l'avez écrit dans les deux cas. Exposez-le simplement publiquement.Knerd fait un bon point: les propriétés peuvent être sérialisées. Vous ne désérialiserez jamais du HTML, donc cela n'a pas beaucoup de sens d'en faire une propriété de ce point de vue.
Conformément à la façon dont les ORM et les objets du référentiel fonctionnent: les champs d'un enregistrement ou d'un tuple sont représentés avec des propriétés, mais vous récupérez l'enregistrement (ou une forme quelconque ) à l'aide d'une méthode.
la source