Dovrei esporre un valore "calcolato" come proprietà o metodo?


13

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 contenuti web di inserire un modello HTML per come viene visualizzato l'oggetto. In pratica utilizza la sintassi del manubrio per sostituire i valori delle proprietà dell'oggetto nella stringa HTML:

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

Dal punto di vista del design della classe, dovrei esporre la stringa HTML formattata (con sostituzione) come 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 che fa la differenza o ci sono ragioni per cui un approccio è migliore dell'altro?


Il vantaggio delle proprietà, sono serializzate in XML o JSOn, ma questo è quello che penso.
Knerd,

1
Le proprietà dovrebbero rappresentare informazioni sullo stato. Non importa se vengono calcolati o meno. Semplifica il loro utilizzo nelle espressioni. Solo tu sai se HTML rappresenta uno stato dell'oggetto.
Reactgular

Risposte:


18

AGGIORNAMENTO: Questa domanda è stata l'oggetto del mio blog a 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 dice il suo colore, l'anno o il modello sono le proprietà di un'auto.

  • 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à.

  • incapace di fallire. I scommettitori dovrebbero sempre restituire un valore, indipendentemente dallo stato dell'oggetto.

Non credo che la tua Htmlproprietà proposta colpisca nessuno di questi. Non renderlo una proprietà a meno che non li colpisca tutti .


"impossibile fallire. Getters dovrebbe sempre restituire un valore indipendentemente dallo stato dell'oggetto." Le proprietà non dovrebbero generare un'eccezione dopo che il loro oggetto è stato eliminato?
Stephen,

6

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

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

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.