2009-12-16 22 views
7

Esiste un modo per scrivere questa logica in un'unica linea di codice elegante?Cosa si può fare in ColdFusion in una singola riga?

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

Cosa c'è di sbagliato in quello che hai? Linea singola! = Elegante. –

+0

Dipende se pensi concisi == elegante. Le opinioni variano. –

+0

@anon, apparentemente non hai scoperto l'operatore ternario supportato da molte lingue. –

risposta

26

Coldfusion 9:

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

ColdFusion 8 e sotto:

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

Qualcuno dirà che IIf() è da evitare per motivi di prestazioni. In questo semplice caso sono sicuro che non troverai alcuna differenza. Il blog di Ben Nadel ha more discussion on IIF() performance e the new ternary operator in CF 9.

+0

ColdFusion 9 & Railo 3.1 – Sergii

+0

Qualcuno con CF9 sa se posso utilizzare == anziché EQ nella versione CF9? Immagino che sia ancora la miglior pratica della CF usare l'EQ visto che è retrocompatibile, ma non sarebbe importante in questo caso. –

+1

In pratica, per la manutenibilità del codice, sostituirei il codice codificato 75 con una variabile che può essere impostata in un file di configurazione. –

2

Come ha detto Neil, va bene così com'è. Se si vuole veramente una sola linea che si potrebbe fare un cfscript con un operatore ternario, come:

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

non ho ancora testato questo codice, ma dovrebbe funzionare.

+2

Questo non funzionerà sotto ColdFusion 9. – Jayson

+0

Buon punto, non sono sicuro del motivo per cui non l'ho menzionato. Grazie! – Pablo

6

Trovo il tuo originale abbastanza elegante - racconta la storia, facile da leggere. Ma è sicuramente una preferenza personale. Fortunatamente ci sono almeno nove modi per fare qualsiasi cosa in CFML.

Si può mettere che su una linea (CFML non ha i requisiti end-of-line):

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

Si può anche usare IIF() Function - lo farà il trucco:

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

Questo costrutto è un po 'strano - penso sia più chiaro. La forza di IIF() è che può anche essere usato in linea (è una funzione dopo tutto). Per esempio:

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

Questa ultima forma è spesso utilizzato per mantenere un (er) il layout HTML pulita, mentre l'iniezione di codice dinamico.

+1

Credo che 'IIf()' richiede l'uso di 'DE()'. – Tomalak

+0

@Tomalak: Non penso sia necessario in questo caso poiché passiamo interi anziché stringhe. (fonte: http://livedocs.adobe.com/coldfusion/8/htmldocs/help.html?content=functions_c-d_37.html) –

+1

Esatto - DE() è "Ritardo valutazione" - ed è probabilmente la parte più confusa di usare IIF(). Di default ciascuna clausola di IIF() viene valutata (come se nella funzione Evaluate()). Se questo NON è quello che vuoi, devi usare DE() - ma in questo caso si tratta di espressioni semplici, quindi non importa. Non farà male usarlo, ma non è necessario. –

1

personalmente preferisco qualcosa di più lungo le linee di questo:

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

Se siete alla ricerca di codice conciso, allora si può prendere un ulteriore passo avanti rispetto agli altri esempi, approfittando della valutazione di CF di non -zero valori come true:

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

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

Naturalmente, avrete sacrificare un po 'di chiarezza, ma questo è il compromesso per il codice più compatto.

Problemi correlati