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?
c#
design-patterns
class-design
methods
properties
Charles Wesley
źródło
źródło
Odpowiedzi:
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
Html
nieruchomość trafiła w którekolwiek z nich. Nie rób z tego własności, chyba że trafi na wszystkie z nich.źródło
ToHtml
jest 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.
źródło