2016-06-22 4 views
1

gibt es eine Schule des Denkens in der Java-Community mit-repect-auf mehr kehrt in einem Verfahren verwendet wird, wie im Folgenden dargestellt:Java Stil mit Achtung-to Multiple Returns, gebraucht als "Wächter"

public SomeClass someMethod(int someValue) { 
    if (someValue < SOME_CONSTANT) { 
     return null; 
    } 

    SomeClass someClass = null; 
    // and now, the body of the method that performs 
    // the heavy lifting 
    return someClass; 
} 

Ich "wuchs" unter dem Mantra "single-entry-point, single-exit-point", aber ich kann sehen, wie die Verwendung einfacher Wachen den Code lesbarer/wartbarer machen (dh Ebenen der Verschachtelung eliminieren). Der „Single-Ausgang-Punkt“ -Version wie ... aussehen würde

public SomeClass someMethod(int someValue) { 
    SomeClass someClass = null; 

    if (someValue < SOME_CONSTANT) { 
     // and now, the body of the method that performs 
     // the heavy lifting 
    } 
    return someClass; 
} 

Dies ist zugegebenermaßen etwas wie ein triviales Beispiel, aber ich kann sehen, wo mehr Voraussetzungen in größerer Verschachtelung führen könnten. Persönlich würde ich immer noch halten, "Renditen während der Methode nicht zu streuen" für andere Zwecke (dh nur "Rückkehr" als Ergebnis einer Wache oder am Ende der Methode), aber ich frage mich, wie Rest der Java-Community fühlt sich an.

hinzugefügt "apple Beispiel" ...

public Pie makeApplePie(Apple apple) { 
    if (apple == null) { 
     return null; 
    } 

    // do cool stuff with apple 
    return new Pie(); 
} 
+0

'someMethod' In dem Beispiel, das Sie beschrieben haben, scheint es zwei Rollen zu geben, im Gegensatz zu einem. Normalerweise würde ich 'someValidation' in einer Methode tun, und wenn es passiert, dann' 'someMethod' 'weiter so lange arbeiten, bis' someValidation' vergeht. Wenn Sie eine Methode namens "cutApple" haben, die Objekte akzeptiert, die nicht Apple sind, aber nichts mit Nicht-Äpfeln, warum verifizieren Sie nicht einfach, ob das Objekt ein Apple ist, bevor Sie darum bitten, es zu schneiden? – Compass

+0

Sie haben den Punkt meiner Frage etwas verpasst. Wenn ich "Äpfel" haben wollte, dann würde ich den Parameter eingeben (Vice macht eine separate Validierung). Aber, mit deinem Beispiel. Ich habe meiner ursprünglichen Frage ein "Apfel-Beispiel" hinzugefügt. Aber meine ursprüngliche Frage bezüglich der Verwendung von Returns als Wächter bleibt die Hauptimplementierung einer Methode. – SoCal

+0

http://StackOverflow.com/Tags/Coding-Style/info – shmosel

Antwort

0

Ich ziehe es auf jeden Fall einzelnen Ausgang, es sei denn, Ihre Logik Dich gezwungen. Manchmal gibt es eine for-Schleife, in der Sie Ihr Ergebnis berechnet haben und damit brechen wollen. Und dann kann es mehr Aussagen sein, nachdem für Schleife, die Sie wollen, nicht sofort zur Ausführung aber zurückkehren, dann haben Sie keine andere Wahl als

Im Folgenden Code mehr return Aussagen zu haben:

public SomeClass myMethod() 
{ 
    SomeClass sc = null; 

    for (int i = 0; i < (someCondition); i++) 
    { 
     //computed result 
     sc = result; 
     return sc; //result is SomeClass 
    } 

    //Some more machinery to assign a value to sc 

    return sc; 
}