Hi ich versuche zu verstehen, wie ich eine lesbare und auch Fehler verhindernde Fluent-API ohne große Einschränkung für den Benutzer erstellen konnte
Um es einfach zu halten, sagen wir, wir wollen die folgende Klasse wechseln, um fließend zu sein
%Vor% das Problem in diesem Fall sollte der Benutzer nur auf Mpg()
zugreifen können, wenn Weight()
und Fuel()
zuerst aufgerufen wurde und auch die Position von HorsePower()
irrelevant ist.
Beispiele:
%Vor%Gibt es einen einfachen Weg, dies ohne eine große Anzahl von Schnittstellen zu tun? Ich auch nicht, wie diese verschachtelten Schnittstellen in der richtigen Weise zu implementieren
Hier sind die Schnittstellen, die ich gerade erstellt habe
%Vor%BEARBEITEN für Adam Houldsworth: -)
Wie implementieren Sie die obige Schnittstelle, um dies zu tun?:
%Vor%Eine Alternative könnte sein, alle Operationen auf Mpg () aufzurufen, die die anderen Operationen konditional machen können.
Dies wird bereits in SO mit einem Codebeispiel beantwortet. Weitere Informationen finden Sie unter Conditional Builder-Methode zum Verketten fliessender Schnittstelle
Der Post gibt an, dass anstelle von Interfaces dasselbe mit Konstruktoren erreicht werden kann, mit einer Aufrufmethode, die alle anderen Operationen bedingt.
Fluent API ist eine nette Sache, aber ich würde in Ihrem Fall einen anderen Weg gehen. Ein Auto zu bauen zieht mich mehr in Richtung des Builder-Musters . Auf diese Weise würden Sie ein Auto verstecken, das in einer Fabrik komponiert wurde (nicht das Fabrikmethodenmuster), das Befehle wie Sie jetzt akzeptiert, aber keine Fragen akzeptiert.
Kein Hersteller lässt Sie Details über sein neues Auto wissen, es sei denn, es ist fertig und bereit, angekündigt zu werden. Sie müssten also einen Befehl wie GetMyCar()
senden, um zuerst ein Auto freizugeben Wenn Sie Mpg
auf unfertiges Auto aufrufen, erhalten Sie eine Ausnahme. Und es würde immer noch gut aussehen, wenn Sie dieses fließende Muster verwenden.
Ok, das ist meine Meinung. Es gibt jedoch zwei weitere Vorschläge für Ihre aktuelle Situation, aus denen Sie auswählen können, wenn Sie den Builder nicht mögen.
1) Wenn der Benutzer Mpg
aufruft, bevor Weight
und Fuel
gesetzt sind, wird eine Ausnahme mit einer Meldung ausgelöst, die die Situation erklärt. Fügen Sie auch eine ordnungsgemäße Dokumentation der Methode Mpg
hinzu.
2) Lassen Sie einen Konstruktor alle erforderlichen Parameter für andere Eigenschaften übernehmen. Dies ist meiner Meinung nach eine bessere Lösung als die erste, denn von Anfang an ist das, was Sie erwarten können.
Tags und Links c# fluent-interface fluent