Gibt es Techniken, um eine Methode mit einem Flag-Argument zu teilen?

8

Ich habe eine Methode mit einem Flag-Argument. Ich denke, dass das Übergeben eines booleschen Wertes an eine Methode eine schlechte Übung ist (verkompliziert die Signatur, verstößt gegen das Prinzip "Jede Methode macht eine Sache"). Ich denke, die Methode in zwei verschiedene Methoden aufzuteilen ist besser. Aber wenn ich das tue, wären die beiden Methoden sehr ähnlich (Code Duplikation).

Ich frage mich, ob es einige allgemeine Techniken gibt, um Methoden mit einem Flag-Argument in zwei separate Methoden aufzuteilen.

Hier ist der Code meiner Methode (Java):

%Vor%     
snakile 24.11.2010, 11:41
quelle

9 Antworten

3

Ich denke, es kommt auf jeden einzelnen Fall an.

In diesem Beispiel haben Sie meiner Meinung nach zwei Möglichkeiten.

Angenommen, Sie möchten den Aufruf calculateNumOfLiveOrDeadNeighbors()

teilen

in zwei:

%Vor%

und

%Vor%

Sie können die Vorlagenmethode verwenden, um die Schleife in eine andere Methode zu verschieben. Sie können damit in den beiden Methoden tote / lebende Zellen zählen.

%Vor%

Es ist mühsam, vielleicht nicht einmal den Schmerz wert. Alternativ können Sie eine Monade verwenden, um die Ergebnisse Ihrer Statistikberechnung zu speichern und dann getDeadCounter() zu verwenden. oder getLiveCounter() auf der Monade, wie viele bereits vorgeschlagen haben.

    
Manrico Corazzi 24.11.2010, 11:57
quelle
5

Wenn Ihnen der Boolesche Wert Ihrer Signatur nicht gefällt, können Sie zwei verschiedene Methoden ohne diese hinzufügen, indem Sie auf private die Hauptfunktion umgestalten:

%Vor%

ODER

Sie könnten eine Ergebnisklasse oder int-Array als Ausgabeparameter zum Speichern der beiden Ergebnisse codieren; Das würde Sie den lästigen booleschen Parameter loswerden lassen.

    
systempuntoout 24.11.2010 11:50
quelle
4
  • Sie können versuchen, die allgemeine Funktionalität in einer einzigen Methode zu extrahieren und nur die spezifische Funktionalität
  • zu verwenden
  • Sie können eine private Methode mit diesem Flag erstellen und sie über die beiden öffentlichen Methoden aufrufen. Daher wird Ihre öffentliche API nicht die "komplizierte" Methodensignatur aufweisen und Sie werden keinen doppelten Code haben
  • Erstellen Sie eine Methode, die beide Werte zurückgibt, und wählen Sie in jedem Aufrufer eine (öffentliche Methode).

Im obigen Beispiel finde ich die zweite und dritte Option zutreffender.

    
Bozho 24.11.2010 11:46
quelle
1

Sieht so aus, als wäre der semantisch sauberste Ansatz, ein Ergebnisobjekt zurückzugeben, das beide Werte enthält, und den aufrufenden Code aus dem Ergebnisobjekt extrahieren zu lassen, was ihn interessiert.

    
Carl 24.11.2010 11:46
quelle
1

Wie Bozho sagte: Aber aber kombinieren Punkt 2 und 3 anders herum:

Erstellen Sie eine (mögliche private Methode), die sowohl (lebend und tot) als auch (nur wenn Sie in den meisten Fällen tot oder lebendig brauchen) zwei Methoden hinzufügen, die tot oder beides aus dem Ergebnis auswählen:

%Vor%     
Ralph 24.11.2010 11:54
quelle
1

IMO, dieses sogenannte "Jede Methode macht eine Sache" Prinzip muss selektiv angewendet werden. Ihr Beispiel ist eines, wo es wahrscheinlich besser ist, es NICHT anzuwenden. Stattdessen würde ich die Methodenimplementierung einfach vereinfachen:

%Vor%     
Stephen C 24.11.2010 11:53
quelle
1

Was die Verwendung von Refactoring betrifft, sind einige Dinge, die Sie tun können:

  • Kopieren Sie die Methode und erstellen Sie zwei Versionen, eine mit true hardcodiert und die andere falsch hartcodiert. Ihre Refactoring-Tools sollten Ihnen helfen, diese Konstante inline zu integrieren und Code nach Bedarf zu entfernen.
  • erstellt die Methode, die die richtige Methode "true / false" aufruft, wie oben für die Abwärtskompatibilität. Sie können diese Methode dann inline einfügen.
Peter Lawrey 24.11.2010 12:13
quelle
1

Ich würde hier geneigt sein, eine Karte aus dem CellState-Enum zu zählen, dann fügen Sie das LIVE und das SICK oder das DEAD und das DEAD4GOOD nach Bedarf hinzu.

%Vor%     
Carl Manaster 24.11.2010 14:46
quelle
0

habe eine private Methode, die genau das ist, was du gerade hast. Erstellen Sie dann zwei neue Methoden mit jeweils aussagekräftigeren Namen, die Ihre private Methode einfach mit dem entsprechenden booleschen

aufrufen     
hhafez 24.11.2010 12:13
quelle