Zu viele if-Anweisungen

8

Ich habe ein Thema zu besprechen. Ich habe ein Code-Fragment mit 24 Wenns / Elifs. Operation ist meine eigene Klasse, die eine ähnliche Funktionalität wie Enum darstellt. Hier ist ein Fragment des Codes:

%Vor%

Ich habe Bedenken aus Sicht der Lesbarkeit. Ist es besser, es in 24 Klassen zu ändern und Polymorphie zu verwenden? Ich bin nicht davon überzeugt, dass es meinen Code beibehalten wird ... Aus einer Hand sind diese Wenns ziemlich klar und es sollte nicht schwer sein zu folgen, auf der anderen Seite gibt es zu viele Wenns.

Meine Frage ist ziemlich allgemein, aber ich schreibe Code in Python, also kann ich keine Konstruktionen wie switch benutzen.

Was denkst du?

UPDATE:

Eine wichtige Sache ist, dass StartObject () , StopObject () und StatusObject () Konstruktoren sind und ich ein Objekt zuweisen wollte Strategie Referenz.

    
Konrad 31.07.2015, 14:27
quelle

6 Antworten

12

Sie könnten möglicherweise ein Wörterbuch verwenden. Wörterbücher speichern Referenzen, was bedeutet, dass Funktionen wie folgt verwendet werden können:

%Vor%

Es ist gut, eine Standardoperation nur für den Fall zu haben, wenn Sie es ausführen, verwenden Sie try except und behandeln Sie die Ausnahme (dh das Äquivalent Ihrer else -Klausel)

%Vor%

Alternativ verwenden Sie die get -Methode eines Dictionary, mit der Sie einen Standard angeben können, wenn der von Ihnen angegebene Schlüssel nicht gefunden wird.

%Vor%

Beachten Sie, dass Sie die Klammern nicht einschließen, wenn Sie sie im Wörterbuch speichern, Sie verwenden sie nur, wenn Sie Ihr Wörterbuch aufrufen. Dies erfordert auch, dass Operation.START hashbar ist, aber das sollte der Fall sein, da Sie es als eine Klasse beschrieben haben, die einem ENUM ähnlich ist.

    
SuperBiasedMan 31.07.2015, 14:30
quelle
3

Pythons Äquivalent zu einer switch-Anweisung ist die Verwendung eines Wörterbuchs. Im Wesentlichen können Sie die Schlüssel speichern, als würden Sie die Fälle und die Werte sind, was für diesen speziellen Fall genannt würde. Da Funktionen Objekte in Python sind, können Sie diese als Wörterbuchwerte speichern:

%Vor%

Welches kann dann wie folgt verwendet werden:

%Vor%

Oder prägnanter:

%Vor%

Dies kann möglicherweise viel besser skalieren als ein Durcheinander von if-else-Anweisungen. Beachten Sie, dass Sie das Wörterbuch nur direkt mit operation_dispatcher[operation] verwenden können, wenn Sie keinen anderen Fall haben.

    
shuttle87 31.07.2015 14:32
quelle
2

Sie könnten etwas wie dies ausprobieren.

Zum Beispiel:

%Vor%

Nenn es so

%Vor%

Diese Methode bietet den Vorteil, einen Standardwert zu liefern (wie eine letzte else-Anweisung). Wenn Sie diese Entscheidungslogik nur an einer Stelle in Ihrem Code verwenden müssen, können Sie natürlich immer strategie = dictionary.get (op, default) ohne die Funktion verwenden.

    
weirdev 31.07.2015 14:37
quelle
1

Sie können einige Introspektion mit getattr verwenden:

%Vor%

Nehmen wir an, die Operation ist "STATUS", sie wird als "Status" groß geschrieben, dann wird sie "Objekt" vorangestellt, was "StatusObject" ergibt. Die Methode StatusObject wird dann für strategy_objects aufgerufen, was katastrophale Fehler zur Folge hat, wenn dieses Attribut nicht existiert oder wenn es nicht aufrufbar ist. :) (zB Fehlerbehandlung hinzufügen.)

Die Wörterbuchlösung ist jedoch wahrscheinlich flexibler.

    
André Laszlo 31.07.2015 14:36
quelle
0

Wenn die Operation.START usw. hashbar sind, können Sie das Dictionary mit Tasten als Bedingung und die Werte als Funktionen verwenden, die aufgerufen werden sollen, zB -

%Vor%

Und dann können Sie dieses Wörterbuch suchen und rufen Sie die Funktion, Beispiel -

%Vor%     
Anand S Kumar 31.07.2015 14:32
quelle
-1

Hier ist ein Bastard-Schalter / Fall mit Wörterbüchern gemacht:

Zum Beispiel:

%Vor%

Dann wird der äquivalente Schalterblock aufgerufen:

%Vor%     
Stiffo 31.07.2015 14:32
quelle