Dois-je exposer une valeur «calculée» en tant que propriété ou méthode?

13

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?

Charles Wesley
la source
L'avantage des propriétés, elles sont sérialisées en XML ou JSOn, mais c'est ce que je pense.
Knerd
1
Les propriétés doivent représenter des informations d'état. Peu importe qu'ils soient calculés ou non. Cela facilite leur utilisation dans les expressions. Vous seul savez si le HTML représente un état de l'objet.
Reactgular

Réponses:

18

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 Htmlpropriété proposée touche à tout cela . N'en faites pas une propriété à moins qu'elle ne les frappe tous .

Eric Lippert
la source
"impossible d'échouer. Les getters doivent toujours renvoyer une valeur quel que soit l'état de l'objet." Les propriétés ne devraient-elles pas lever d'exception une fois leur objet supprimé?
Stephen
6

ToHtmlest 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.

Robert Harvey
la source