Devo esporre un valore "calcolato" come una proprietà o un metodo?

11

Ho una classe C # che rappresenta un tipo di contenuto in un sistema di gestione dei contenuti web.

Abbiamo un campo che consente a un editor di contenuto Web di inserire un modello HTML per la modalità di visualizzazione dell'oggetto. Fondamentalmente utilizza la sintassi del manubrio per sostituire i valori delle proprietà dell'oggetto nella stringa HTML:

<h1>{{Title}}</h1><p>{{Message}}</p>

Da una prospettiva di progettazione di classe, dovrei esporre la stringa HTML formattata (con sostituzione) come una proprietà o metodo ?

Esempio come proprietà:

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

Esempio come metodo:

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

Non sono sicuro dal punto di vista del design se fa la differenza o ci sono ragioni per cui un approccio è migliore dell'altro?

    
posta Charles Wesley 21.03.2014 - 18:13
fonte

2 risposte

16

AGGIORNAMENTO: questa domanda era l'argomento del mio blog nel maggio 2014 . Grazie per l'ottima domanda!

Per aggiungere alla risposta di Robert Harvey : una proprietà dovrebbe essere:

  • logicamente una proprietà della classe, il modo in cui dicono che il suo colore o anno o modello sono le proprietà di una macchina.

  • non più di, diciamo, dieci volte più lento da calcolare rispetto al recupero da un campo.

  • qualcosa che non ti dispiace essere calcolato durante il debug. Il debugger VS calcola automaticamente le proprietà.

  • impossibile fallire. I getter devono sempre restituire un valore indipendentemente dallo stato dell'oggetto.

Non penso che la tua proposta di Html abbia colpito qualsiasi di quelli. Non trasformarlo in una proprietà se non colpisce tutti di essi.

    
risposta data 24.03.2014 - 23:02
fonte
4

ToHtml è correttamente un metodo, come è stato scritto in entrambi i casi. Esponilo pubblicamente.

Knerd è un buon punto: le proprietà possono essere serializzate. Non avresti mai deserializzato dall'HTML, quindi non ha molto senso renderlo una proprietà da quella prospettiva.

Coerente con il modo in cui funzionano gli oggetti ORM e repository: i campi in un record o tupla sono rappresentati con proprietà, ma si recupera il record (o qualche forma di esso) usando un metodo.

    
risposta data 21.03.2014 - 18:32
fonte

Leggi altre domande sui tag