Ich arbeite an einer ASP.NET MVC-App und habe mir angewöhnt, in meine Modell- / Entitätsklassen hilfreiche und praktische Informationen einzufügen.
Beispielsweise:
public class Member
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string PhoneNumber { get; set; }
public string FullName
{
get { return FirstName + " " + LastName; }
}
public string FormattedPhoneNumber
{
get { return "(" + PhoneNumber.Substring(0, 3) + ") " + PhoneNumber.Substring(3, 3) + "-" + PhoneNumber.Substring(6); }
}
}
Ich frage mich, ob die Leute über das FullName
und die FormattedPhoneNumber
Getter nachdenken .
Sie machen es sehr einfach, standardisierte Datenformate in der gesamten App zu erstellen, und sie scheinen viel wiederholten Code zu speichern. Es kann jedoch durchaus argumentiert werden, dass das Datenformat bei der Zuordnung von Modell zu Ansichtsmodell zu berücksichtigen ist.
Eigentlich habe ich diese Datenformate ursprünglich in meiner Service-Schicht angewendet, wo ich mein Mapping durchführe, aber es wurde zu einer Last, ständig Formatierer schreiben zu müssen, um sie dann an vielen verschiedenen Stellen anzuwenden. ZB verwende ich in den meisten Ansichten "Vollständiger Name" und es model.FullName = MappingUtilities.GetFullName(entity.FirstName, entity.LastName);
schien viel weniger elegant als nur zu model.FullName = entity.FullName
tippen (oder, wenn Sie etwas wie AutoMapper verwenden, möglicherweise gar nichts zu tippen).
Wo ziehen Sie die Linie, wenn es um die Datenformatierung geht? Ist es "okay", Daten in Ihrem Modell zu formatieren, oder ist das ein "Mustergeruch"?
Hinweis: Ich habe definitiv kein HTML in meinem Modell. Ich benutze dafür HTML-Helfer. Ich spreche ausschließlich von der Formatierung oder Kombination von Daten (und insbesondere von Daten, die häufig verwendet werden).
quelle
PhoneNumber
gehört es wahrscheinlich zu einer eigenen Klasse (die ich jetzt implementiert habe). AberFullName
war es wirklich der Grund, warum ich die Frage geschrieben habe? Ich bin jedoch daran interessiert herauszufinden, ob es im Allgemeinen sinnvoll ist, Datenformatierungen / -kämme usw. in das Modell aufzunehmen, um Dinge zu erreichen, die für die gesamte Anwendung gelten. Aus den nachstehenden Antworten geht hervor, dass dies kein Gegenmuster ist, aber die Entscheidung sollte sorgfältig getroffen werden.Antworten:
In Ihrem Beispiel gefällt mir der
FullName
Getter (aus all den Gründen, die Sie angegeben haben), aber der Getter FormattedPhoneNumber gefällt mir nicht. Der Grund ist: Es ist wahrscheinlich nicht so einfach (wenn Sie internationale Telefonnummern usw. haben) und wenn Sie die Logik für die Formatierung von Telefonnummern in eine Methode von setzenMember
, müssen Sie wahrscheinlich umgestalten (oder vorsichtig kopieren und einfügen ), sobald Sie braucht eine formated TelefonnummerInstitution
,Vendor
usw. zu.EDIT: IMO wäre es besser, eine
PhoneNumber
Klasse mit einemFormatted
Getter zu haben.quelle
String
Klasse, nehme ich an) "bringen" Sie derString
Klasse bei, wie Telefonnummern formatiert werden. Ist es wirklich Aufgabe derString
Klasse, über Telefonnummern Bescheid zu wissen? Ich glaube nicht. In diesem Sinne sind Erweiterungsmethoden syntaktischer Zucker, um etwas, das eindeutig nicht objektorientiert ist, so aussehen zu lassen, wie es war.PhoneNumber
Klasse. Ich habe sowieso geplant, weil ich auch einePhoneType
Immobilie besitze.PhoneNumber
eine Instanzklasse zu haben, nicht, weil die Daten nativ sindstring
. Vielmehr sollte es eine statische Klasse mit Methoden wie seinpublic static string Format(string phoneNumber, PhoneNumberStyle style)
.Die Dinge, die Sie beim Schreiben von Code beachten müssen: Ist es richtig? Ist es lesbar Ist es effizient? Ist es wartbar? Ich würde, wie @btilly sagte, argumentieren, dass es aufgrund der kulturspezifischen Formatierung nicht wartbar ist, aber die Frage scheint allgemeiner zu sein.
Durch die Verwendung solcher Zugriffsmethoden wird der Code besser lesbar. Je nachdem, wie Sie ihn verwenden, werden andere Teile des Codes möglicherweise wesentlich sauberer. Meiner Meinung nach riecht das überhaupt nicht. Es würde anfangen zu riechen, wenn Sie Formatierungs-Accessoren für irgendeine Art von Zeichenkette hätten, die Sie vielleicht drucken möchten (
public string FirstLastName; public string FullName; public string FullNameWithMiddleInitial; public string PhoneNumberWithAreaCode; public string PhoneNumberWithoutAreaCode; public string PhoneNumberWithCountryCode;
usw.)Oder anders ausgedrückt: Wenn Sie ein Muster verwenden, riecht Ihr Code nicht automatisch nach einem Muster. Sie müssen es missbrauchen, wenn Sie dieses Attribut verdienen möchten.
quelle
Verstößt gegen das Prinzip der einheitlichen Verantwortung. Warum nicht eine Rufnummernklasse machen, etc ...?
quelle
FullName
Klasse machen?Für Ihr Beispiel halte ich es nicht für zu umfangreich, bestimmte Formate zu verwenden. Es ist ein oder zwei und alle Teile der Anwendung verwenden das gleiche Format.
Wenn Sie die gleichen Daten an verschiedenen Orten haben, an denen unterschiedliche Formate erforderlich sind , bricht diese Entscheidung zusammen .
In diesem Fall wäre ich versucht, die
Member
Klasse auf Folgendes zurückzubringen:Und dann machen Sie verschiedene Adapter für jedes Ziel. Angenommen, die Informationen wurden im CSV-Format benötigt:
Immer vorausgesetzt, Sie haben die Daten bereinigt, sodass keine Kommas usw. in den Zeichenfolgen enthalten sind.
Der Adapter muss keine Erweiterungsmethode sein, aber für diesen Fall scheint er zu passen.
quelle
over
, dann stimmt etwas nicht mit dem Design.