Czy powinienem ujawniać „obliczoną” wartość jako właściwość lub metodę?

13

Mam klasę C #, która reprezentuje typ zawartości w systemie zarządzania treścią internetową.

Mamy pole, które pozwala edytorowi treści WWW wprowadzić szablon HTML do wyświetlania obiektu. Zasadniczo używa składni kierownicy do podstawiania wartości właściwości obiektu w ciągu HTML:

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

Czy z perspektywy projektowania klas powinienem udostępniać sformatowany ciąg HTML (z podstawieniem) jako właściwość lub metodę ?

Przykład jako właściwość:

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

Przykład jako metoda:

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

Nie jestem pewien z punktu widzenia projektu, czy to robi różnicę, czy są powody, dla których jedno podejście jest lepsze od drugiego?

Charles Wesley
źródło
Zaletą właściwości są serializacje w XML lub JSOn, ale to chyba tak.
Knerd
1
Właściwości powinny reprezentować informacje o stanie. Nie ma znaczenia, czy są obliczane, czy nie. Ułatwia to używanie ich w wyrażeniach. Tylko ty wiesz, czy HTML reprezentuje stan obiektu.
Reactgular

Odpowiedzi:

18

AKTUALIZACJA: To pytanie było przedmiotem mojego bloga w maju 2014 r . Dzięki za świetne pytanie!


Aby dodać do odpowiedzi Roberta Harveya : właściwość powinna być:

  • logicznie rzecz biorąc, właściwość klasy, sposób, w jaki mówi się, że jej kolor, rok lub model są właściwościami samochodu.

  • nie więcej niż, powiedzmy, dziesięć razy wolniejszy w obliczeniach niż pobieranie z pola.

  • coś, co nie przeszkadza w obliczeniach podczas debugowania. Debuger VS automatycznie oblicza właściwości.

  • nie można zawieść. Pobierający powinni zawsze zwracać wartość bez względu na stan obiektu.

Nie sądzę, żeby twoja proponowana Htmlnieruchomość trafiła w którekolwiek z nich. Nie rób z tego własności, chyba że trafi na wszystkie z nich.

Eric Lippert
źródło
„nie można zawieść. Gettery zawsze powinny zwracać wartość bez względu na stan obiektu”. Czy właściwości nie powinny zgłaszać wyjątku po usunięciu ich obiektu?
Stephen
6

ToHtmljest poprawną metodą, ponieważ napisałeś ją w obu przypadkach. Po prostu ujawnij to publicznie.

Knerd ma rację: właściwości można serializować. Nigdy nie zrezygnowałbyś z deserializacji z HTMLa, więc nie ma sensu uczynić go właściwością z tej perspektywy.

Zgodnie ze sposobem działania ORM i obiektów repozytorium: pola w rekordzie lub krotce są reprezentowane przez właściwości, ale rekord (lub inną jego formę ) pobiera się za pomocą metody.

Robert Harvey
źródło