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>
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>
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.
ColdFusion 9 & Railo 3.1 – Sergii
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. –
In pratica, per la manutenibilità del codice, sostituirei il codice codificato 75 con una variabile che può essere impostata in un file di configurazione. –
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.
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.
Credo che 'IIf()' richiede l'uso di 'DE()'. – Tomalak
@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) –
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. –
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>
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.
Cosa c'è di sbagliato in quello che hai? Linea singola! = Elegante. –
Dipende se pensi concisi == elegante. Le opinioni variano. –
@anon, apparentemente non hai scoperto l'operatore ternario supportato da molte lingue. –