Verständnis für das Erstellen einer fließenden Schnittstelle

9

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: -)

  • Ist das Interface über einem guten oder gibt es einen einfacheren Weg dazu? aber Halten Sie die Einschränkung für Mpg ()?
  • Wie implementieren Sie die obige Schnittstelle, um dies zu tun?:

    %Vor%
WiiMaxx 17.09.2013, 10:00
quelle

2 Antworten

6

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.

    
Consult Yarla 19.12.2013, 16:03
quelle
7

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.

%Vor%

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.

    
Ondrej Janacek 19.12.2013 09:13
quelle

Tags und Links