Ist es eine gute Übung, Methoden zu schreiben, die void zurückgeben?

8

Ich arbeite an einer komplexen Unternehmensanwendung, die in Java geschrieben ist und von komplexen Objektkompositionen gesteuert wird. Zum Beispiel: Um in einem bestimmten Szenario eine Aktion auszuführen, ist dies der Ablauf:

%Vor%

Innerhalb des Frameworks haben fast alle Aktionen einschließlich der Anmeldung, Abmeldung und viele der 10 bis 20 Methodenaufrufe keine Rückgabetypen. Jedes fehlerhafte Verhalten wird vom Framework behandelt. Sprich, im Login

%Vor%

Die zwischen 10 und 20 Aktionen sind Methodenaufrufe auf verschiedenen Objekten auf verschiedenen Ebenen der Hierarchie des Frameworks.

Eine zufällige Klasse würde so aussehen:

%Vor%

Die Variable ändert ihren Zustand oft und diese Aktionen haben eine Sequenz, die nur durch das Framework definiert wird, was ich sehr ärgerlich finde.

Ich würde sagen, wahrscheinlich, wenn es überhaupt angemessene Rückgabetypen oder zumindest einige dieser Methoden gäbe, wie im Fall von Boolean im Fall von login() , wäre das Leben viel einfacher. Wegen dieser engen Befolgung einer Reihe von Funktionen, die die Leerstellen zurückgeben, finde ich es schwierig zu debuggen, um den Ablauf zu verstehen, und auch das Komponententesten wurde für mich zum Albtraum.

Ich habe jetzt den Eindruck, dass es immer besser ist, Funktionen zu schreiben, die etwas zurückgeben, besonders, wenn eine Kette von Aktionen involviert ist . Also, ist das eine sichere Vermutung? Ich möchte deine Meinung dazu sagen. Korrigiere mich, wenn ich falsch liege.

    
Vamsi Emani 26.04.2012, 10:52
quelle

5 Antworten

4

Die Basisprüfbarkeit einer Methode ist am meisten über ihren Rückkehrcode. Im Fall von login müssen Sie (wie Sie angegeben haben) testen können, ob Sie jetzt eingeloggt sind, und ein boolean return ist der offensichtliche Weg. Andernfalls müssen Sie eine Eigenschaft überprüfen, die unnötig atomar und komplex erscheint (obwohl sie aus anderen Gründen benötigt wird).

Für mich erstreckt sich dieses Argument auf jede sinnvolle Methode. Die Verwendung von void return codes ist ziemlich üblich, aber mehr als Folge von alten Gewohnheiten als aus guten Designgründen. Einfache Property Setter sind ein Gegenbeispiel, und ich bin mir sicher, dass es andere gibt.

    
Steve Townsend 26.04.2012, 10:55
quelle
2

Wenn eine Methode mit lokalen Daten in der Klasse arbeitet, ist eine void-Methode durchaus sinnvoll, solange sie ein "Verhalten" modelliert, das im Kontext der Klasse sinnvoll ist. Wenn Sie beispielsweise eine SpecialSortedList haben, die ihren Inhalt sortiert, d. H. MyList.sort (), wäre die Methode sort () ungültig, da sie ein Verhalten modelliert, das einer SpecialSortedList zugeordnet ist.

Wenn eine Methode nicht mit lokalen Daten innerhalb einer Klasse arbeitet, dh ihre Daten über Parameter ausgibt und einige Daten zurückgibt (dh keine Abhängigkeit von lokalen Daten), ist es ratsam, sie als statisch zu deklarieren und sogar zu verschieben es zu einem Dienstprogramm oder einer Hilfsklasse.

    
Jaco Van Niekerk 26.04.2012 10:57
quelle
2

Meiner Meinung nach ist es nicht notwendig, immer etwas über eine Kette von Aktionen zurückzugeben. Es hängt ganz von Ihren Anforderungen ab. In der Login-Authentifizierungsmethode ist es besser, das Boolesche Ergebnis zur Vereinfachung zurückzugeben. Wenn eine Kette von Aktionen unabhängig von der einen und anderen ist, dann gibt es meiner Meinung nach keine Notwendigkeit, etwas zurückzugeben, was durch keine Aktion verwendet wird. Wenn also das Ergebnis einer Aktion die nächste Aktion bewirkt, sollte etwas zur Vereinfachung und zum Testen zurückgegeben werden, so dass Sie direkt von der Ausgabe der Methode, die Probleme verursacht, handeln können. Sobald die Methode identifiziert ist, können Sie die spezifische Methode, die identifiziert wurde, überprüfen. Grundsätzlich hängt alles von Ihren Anforderungen ab. Wenn Ihre Anforderungen besser behandelt werden, ohne etwas zurückzugeben, sollten Sie damit fortfahren. Auch sollten Sie die Best Practices oder Design Patterns für die Effektivität befolgen, die für alle Situationen besser sind und Sie am Ende Chaos schaffen können. Es ist nur meine Meinung.

    
Shehzad 26.04.2012 11:03
quelle
0

Ich bevorzuge mehr und mehr, etwas wie einen Statuscode anstelle von void zurückzugeben. Das macht ein paar Dinge:

  1. Ich erlaube dem Code, die aufgerufene Funktion zu wissen, was als nächstes zu tun ist (zum Beispiel, wenn der Vorgang fehlgeschlagen ist, muss der aufrufende Code etwas anderes tun, wenn der Vorgang erfolgreich war).
  2. Es ist einfacher zu testen und zu debuggen (wie Sie erwähnen). Ich habe begonnen zu glauben, dass das Schreiben von Code für die Testbarkeit einer der besten Wege ist, um die Codequalität zu gewährleisten (vorausgesetzt natürlich, dass Sie es tatsächlich testen). Void-Funktionen sind schwer zu testen.

Ich bevorzuge, wann immer es möglich ist, die meisten Funktionen zu parametrieren, eine Antwort zurückzugeben und keine Klassenvariablen zu ändern. Wie von Jaco erwähnt, können diese als statisch deklariert und sogar in eine Utility-Klasse verschoben werden. Dann können Sie einige Controller-Funktionen verwenden, die Funktionen verwenden, die Werte zurückgeben.

    
Paul J Abernathy 13.09.2013 18:41
quelle
0

Ich würde die Antwort in zwei Teile teilen:

  • Wann wird "void" nützlich zurückgegeben -

    Wenn die Methode nur einen Wert zurückgibt, der auf einen falschen Status / eine Ausnahme hinweist, sollte sie "void" zurückgeben. Die Exception sollte sich um die Behandlung aller Fehlerszenarien kümmern und nicht etwa um einen "booleschen" Rückgabewert . Jetzt muss der aufrufende Code erneut sowohl den booleschen als auch den Ausnahmecode validieren. Wenn es nur Exception geworfen hat, dann ist es viel einfacher & amp; klarer für den aufrufenden Code.

  • Wann ist die Rückgabe ungültig, nicht so nützlich -

    Wenn die Methode eine Operation ausführt und als Ergebnis einen Wert zurückgibt, dann sollte "void" nicht zurückgegeben werden, der relevante Ergebnistyp (boolean / integer / object usw.) muss zurückgegeben werden.

Im Allgemeinen sollte der Rückgabewert dem entsprechen, ob die Methode etwas zurückgibt oder nicht. Es sollte nicht entsprechen, ob die Methode richtig ausgeführt wurde (nun ja, es sollte auch so sein). Alle Eingabevalidierungs- / Ausnahmeszenarien sollten behandelt werden, indem entsprechende Ausnahmen ausgelöst werden. Beispiel: Wirf IllegalArgumentException ab, wenn die Eingabe ungültig ist, anstatt "boolean" -Sprachmethode zurückzugeben, die nicht ausgeführt wurde.

    
subrap 15.09.2014 07:52
quelle

Tags und Links