Ich arbeite in einem System, das auf zwei Arten eine "Versandschätzung" darstellen kann:
- Ein bestimmtes Datum: Der Artikel wird garantiert zu diesem Datum versendet
- Ein Tagesintervall: Der Artikel wird ab heute "X bis Y" Tage versendet
Die Informationen zum Modell sind semantisch identisch, es handelt sich um "die Versandschätzung". Wenn ich die Informationen über den Versandvoranschlag vom System erhalte, kann ich feststellen, ob der Kostenvoranschlag vom ersten oder vom zweiten Formular ist.
Das aktuelle Modell hierfür ähnelt dem folgenden:
class EstimattedShippingDateDetails
{
DateTime? EstimattedShippingDate {get; set;}
Range? EstimattedShippingDayRange {get; set;}
}
Range
ist eine einfache Klasse, um einen "Anfang -> Ende" von ganzen Zahlen zu umbrechen, ähnlich wie folgt:
struct Range
{
int Start {get; set}
int End {get; set}
public override ToString()
{
return String.Format("{0} - {1}", Start, End);
}
}
Dieser Ansatz gefällt mir nicht, da nur eine der Eigenschaften des Schätzmodells jemals ausgefüllt wird und ich bei einer von ihnen auf Null testen und davon ausgehen muss, dass die andere über die Daten verfügt.
Jede der Eigenschaften wird für den Benutzer anders angezeigt, jedoch an derselben Stelle auf der Benutzeroberfläche. Dabei wird eine benutzerdefinierte MVC DisplayTemplate verwendet, in der sich die aktuelle Schaltlogik befindet:
@Model EstimattedShippingDateDetails
@if (Model.EstimattedShippingDate.HasValue)
{
Html.DisplayFor(m => Model.EstimattedShippingDate)
}
else
{
Html.DisplayFor(m => Model.EstimattedShippingDayRange)
}
Wie könnte ich dies modellieren, um es repräsentativer für die tatsächliche Anforderung zu machen und gleichzeitig die Anzeigelogik in einer MVC-Anwendung einfach zu halten?
Ich habe darüber nachgedacht, eine Schnittstelle und zwei Implementierungen zu verwenden, eine für jeden "Schätztyp", aber ich kann mich nicht um eine gemeinsame Schnittstelle für beide kümmern. Wenn ich eine Schnittstelle ohne Mitglieder erstelle, kann ich nicht einheitlich auf die Daten zugreifen, und es ist meiner Meinung nach ein schlechtes Design. Ich wollte auch das Ansichtsmodell so einfach wie möglich halten. Mit diesem Ansatz würde ich jedoch einen "durch Konstruktion korrekten" Code erhalten, da es keine Nullables mehr geben müsste: Jede Implementierung hätte eine nicht nullable Eigenschaft, entweder a DateTime
oder a Range
.
Ich habe auch in Betracht gezogen, nur eine einzige zu verwenden, Range
und wenn Situation Nr. 1 eintritt, verwenden Sie einfach dieselbe DateTime
für beide Start
und End
, aber dies würde zu Komplikationen bei der Ausgabe der Werte an die Benutzeroberfläche führen, da ich dann feststellen müsste, ob es sich um eine statische Aufladung oder ein Intervall von handelt Vergleichen Sie die Werte und formatieren Sie den Bereich richtig, um ihn entweder als einzelnes Datum oder als formatiertes Intervall anzuzeigen.
Es scheint, dass ich ein Konzept brauche, das den Gewerkschaften von Typescript ähnelt: im Grunde eine Eigenschaft, die zwei Arten haben kann. Natürlich gibt es so etwas in C # nicht nativ (nur dynamic
in der Nähe davon).