2009-12-16 10 views
7

Gibt es eine Möglichkeit, diese Logik in einer einzigen, eleganten Codezeile zu schreiben?Was können Sie in ColdFusion in einer einzigen Zeile tun?

<cfif ThumbnailWidth EQ 0> 
    <cfset Width = 75> 
<cfelse> 
    <cfset Width = ThumbnailWidth> 
</cfif> 
+8

Was ist los mit dem, was du hast? Einzellinie! = Elegant. –

+0

Das hängt davon ab, ob Sie prägnant == elegant denken. Meinungen variieren. –

+0

@anon, offenbar haben Sie den ternären Operator nicht entdeckt, den viele Sprachen unterstützen. –

Antwort

26

Coldfusion 9:

<!--- Syntax: ((condition) ? trueStatement : falseStatement) ---> 
<cfset width = ((ThumbnailWidth EQ 0) ? 75 : ThumbnailWidth) /> 

Coldfusion 8 und unten:

<!--- Syntax: IIf(condition, trueStatement, falseStatement) ---> 
<cfset width = IIf((ThumbnailWidth EQ 0), 75, ThumbnailWidth) /> 

Einige werden sagen, dass IIf() aus Leistungsgründen vermieden werden soll. In diesem einfachen Fall werden Sie sicher keinen Unterschied finden. Ben Nadels Blog hat more discussion on IIF() performance und the new ternary operator in CF 9.

+0

ColdFusion 9 & Railo 3.1 – Sergii

+0

Weiß jemand mit CF9, ob ich in der CF9-Version == anstelle von EQ verwenden kann? Ich schätze, es ist immer noch das beste Verfahren für CF, EQ zu verwenden, da es abwärtskompatibel ist, aber in diesem Fall spielt es keine Rolle. –

+1

In der Praxis würde ich für die Wartbarkeit von Code die hartcodierte 75 durch eine Variable ersetzen, die in einer Konfigurationsdatei gesetzt werden kann. –

2

Wie Neil sagte, es ist in Ordnung, wie es ist. Wenn Sie wirklich eine einzige Zeile wünschen könnte man es eine cfscript mit einem ternären Operator machen, wie:

<cfscript>width = (ThumbnailWidth == 0) ? 75 : ThumbnailWidth;</cfscript> 

Haben Sie diesen Code nicht getestet, aber es sollte funktionieren.

+2

Dies funktioniert nicht unter ColdFusion 9. – Jayson

+0

Guter Punkt, nicht sicher, warum ich das nicht erwähnt habe. Vielen Dank! – Pablo

6

Ich finde Ihr Original elegant genug - erzählt die Geschichte, einfach zu lesen. Aber das ist definitiv eine persönliche Vorliebe. Glücklicherweise gibt es in CFML immer mindestens neun Möglichkeiten, etwas zu tun.

können Sie, dass in einer Zeile setzen (CFML hat keine end-of-line-Anforderungen):

<cfif ThumbnailWidth EQ 0><cfset Width = 75><cfelse><cfset Width = ThumbnailWidth></cfif> 

Sie auch IIF() Function verwenden können - es wird den Trick:

<cfset Width = IIf(ThumbnailWidth EQ 0, 75, ThumbnailWidth)> 

Dieses Konstrukt ist ein wenig seltsam tho '- ist klarer, denke ich. Die Stärke von IIF() ist, dass es auch inline verwendet werden kann (es ist schließlich eine Funktion). Beispiel:

<img src="#ImageName#" width="#IIf(ThumbnailWidth EQ 0, 75, ThumbnailWidth)#"> 

Diese letzte Form wird oft verwendet, um ein sauberes (er) HTML-Layout beizubehalten, während dynamischer Code injiziert wird.

+1

Ich glaube, dass 'IIf()' erfordert die Verwendung von 'DE()'. – Tomalak

+0

@Tomalak: Ich denke nicht, dass es in diesem Fall erforderlich ist, da wir ganze Zahlen statt Strings übergeben. (Quelle: http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions_c-d_37.html) –

+1

Genau - DE() ist "Delay Evaluation" - und es ist wahrscheinlich der verwirrende Teil der Verwendung von IIF(). Standardmäßig wird jede Klausel von IIF() ausgewertet (wie in der Funktion Evaluate()). Wenn das NICHT ist, was Sie wollen, müssen Sie DE() verwenden - aber in diesem Fall sind dies einfache Ausdrücke, also spielt es keine Rolle. Es wird nicht schaden, es zu benutzen - aber es wird nicht benötigt. –

1

Ich persönlich bevorzuge etwas mehr nach dem Vorbild dieser:

<cfscript> 
    Width = ThumbnailWidth; 
    if(NOT Val(Width)) // if the Width is zero, reset it to the default width. 
    Width = 75; 
</cfscript> 
2

Wenn Sie für kurzen Code suchen, dann können Sie es einen Schritt weiter als die anderen Beispiele, die Vorteile von CF Bewertung von nicht unter -Nullsignal Werte als true:

<!--- CF 9 example ---> 
<cfset width = ThumbnailWidth ? ThumbnailWidth : 75> 

<!--- CF 8 and below ---> 
<cfset width = iif(ThumbnailWidth, ThumbnailWidth, 0)> 

Natürlich, werden Sie ein wenig Klarheit opfern, aber das ist der für kompaktere Code Kompromisses.

Verwandte Themen