2011-01-07 4 views
1

Ich würde gerne Ihre Meinung über die Verwendung return und else Aussagen synonym in CFScript wissen. Ich verwenden in der Regel die folgende Syntax:Können in CFScript die Anweisungen return und else synonym verwendet werden?

if (something) { 
    // Do something 
} 
else { 
    // Do something else 
} 

Es vor kurzem fiel mir ein, ich könnte dies tun, anstatt:

if (something) { 
    // Do something 
    return; 
} 
// Do something else 

Würden diese beiden Arten ergeben ein anderes Endergebnis? Ich mag es nicht, Code in eine else Anweisung einzupacken. Mein Denken ist, dass, wenn die if-Anweisung wahr und zurückgibt, der Code darunter nicht ausgeführt wird. Wenn es nicht wahr auswertet, wird der Code darunter ausgeführt, unabhängig davon, ob es in eine else-Anweisung eingebettet ist oder nicht.

Klingt das richtig?

+1

Ja, solange Sie eine "Rückkehr" verwenden, die korrekt ist. Wenn es ein oder zwei Zeilen Code ist, bevorzuge ich die zweite Methode. Aber für mehr als das ist die erste Methode lesbarer/intuitiver IMO. – Leigh

+4

Siehe http://stackoverflow.com/questions/36707/should-a-function-have-only-one-return-statement für eine umfassende Diskussion dieser Idee in allen Programmiersprachen. Ihr Beispiel # 2 wird von Fowler als "Guard Statement" bezeichnet. – orangepips

+0

@orangepips +1 für den tollen Thread – Leigh

Antwort

4

Coldfusion wie die meisten Sprachen bietet viele Möglichkeiten zur Ausführung die gleiche Sache bevorzugt. Die Aufgabe des Programmierers ist es, die richtige für die Situation auszuwählen. Natürlich kann "richtig" viele Interpretationen haben, aber ich würde sagen, der richtige Weg ist klar, prägnant und skalierbar.

In diesem Fall gibt es keine echten Leistungsunterschiede oder "Codezeilen". Die Verwendung eines Rückgabewerts für einen ganz anderen Codezweig ist für meine Augen jedoch nicht klar. Die Verwendung eines frühen Rückgabestils, um aufgrund ungültiger Bedingungen aus einer Funktion herauszukommen, ist (wieder IMO) klarer. Betrachten Sie die folgenden Fälle:

if (not isdefined("url.param1")) { 
    return; 
} 
if (not len(url.param1)) { 
    return; 
} 
if (not refind("[0-9]+", url.param1)) { 
    return; 
} 
doSomethingToValid(url.param1); 

gegen

if (isdefined("url.param1")) { 
    if (len(url.param1)) { 
    if (refind("[0-9]+", url.param1)) { 
     doSomethingToValid(url.param1); 
    } 
    } 
} 

Im ersten Fall, dass ich alle die Validierung sehen, die in einer Liste angewendet wird, und ich kann sie alle aus dem Weg räumen vorne wodurch ich mich auf die eigentliche Substanz der Routine konzentrieren kann. Im zweiten Fall habe ich den wesentlichen Teil der Routine tief in einem verschachtelten Abschnitt von ifs vergraben, und wenn ich eine weitere Regel zur Validierung hinzufügen muss, wird die Code-Struktur einfach komplexer.

+0

Nick, das ist genau die Situation, in der ich mich befand. Danke, das war sehr nützlich. – Mohamad

2

Die beiden Arten des Schreibens es die gleichen Ergebnisse liefern, aber aus Gründen der Lesbarkeit ist der erste Weg