Você está na página 1de 17

Melhores prticas

para
desenvolvimento em
ColdFusion
Correios/DESIN/GEWB

Correios DESIN / GEWB

Verso 1.5

Histrico das Revises


Data

Verso

29/11/2006

1.0

10/01/2007

1.1

12/01/2007

1.2

17/01/2007

1.3

Descrio
Incluso de exemplos, grficos e dos tpicos:
- No se usa aspas em numerais;
- Usar o atributo HINT nos componentes;
- Declarar escopo de varivel em arquivos .cfc
- Link para a documentao ColdFusion.
- Incluso do item CFSILENT
- Correo do Exemplo da Declarao do Escopo
de varivel dentro de Componente (CFC).
Incluso de 2 itens.
- Use o atributo OUTPUT das tags
CFFUNCTION e CFCOMPONENT como NO
ou FALSE.

Autor
Equipe Qualidade
(Desun/DSNW)

Equipe Qualidade
(Desun/DSNW)
Equipe Qualidade
(Desun/DSNW)

Equipe Qualidade
(Desun/DSNW)

- CFARGUMENT.
13/09/2007

1.4

Incluso do item timeout

18/10/2007

1.5

Incluso do valor do atributo timeout

Correios DESIN / GEWB

Equipe Qualidade
(Desun/DSNW)
Equipe Qualidade
(Desin/GEWB)

Verso 1.5

ndice
1.

Uso de Cerquilhas ........................................................................................................ 5


Exemplo: .......................................................................................................................... 5

2.

Use Escopo de Variveis .............................................................................................. 5

3.

Faa cache de consulta sempre que possvel. ............................................................. 6


Exemplos:......................................................................................................................... 6

4.

Listas longas de CFELSEIF........................................................................................ 6

5.

SQL e COLDFUSION.................................................................................................. 6

6.

Uso de CFOUTPUT ao CFLOOP ............................................................................... 7

7.

Uso de Listas e Arrays .................................................................................................. 7

8.

Uso de CFQUERY........................................................................................................ 7

9. Qual a diferena entre <CFIF IsDefined("var")> e <CFIF IsDefined("var") IS


"Yes">? ................................................................................................................................ 8
10.

Use sempre o CFAPPLICATION para: .................................................................. 8

11.

Quando devemos usar <CFLOCK>?....................................................................... 8

12.

Qual a diferena entre locks do tipo EXCLUSIVE e do tipo READONLY? ...... 9

13.

Utilizando datas no SQL .......................................................................................... 9

14.

Execuo de rotinas com espao de tempo definido (CFSCHEDULE) ................ 9

15.

Certificando a Consistncia dos Dados ................................................................. 10

16.

Checando tempo de execuo do cdigo ............................................................... 10

17.

Validao Cliente X Validao Servidor ............................................................... 10

18.

Use Stored Procedures ........................................................................................... 11

19.

Use <CFQUERYPARAM> .................................................................................... 11

Exemplo: ........................................................................................................................ 11
20.

Respeite as palavras reservadas ao SQL ............................................................... 11

21.

Nunca assuma a existncia de uma varivel......................................................... 11

22.

Use a funo LEN() para testar valores vazios. .................................................... 12

Exemplo: ........................................................................................................................ 12
23.

Use a funo CompareNoCase() para comparar duas Strings ............................ 12

Exemplo: ........................................................................................................................ 12
24.

Evite usar ASPAS em nmeros.............................................................................. 13

Exemplo: ........................................................................................................................ 13

Correios DESIN / GEWB

Verso 1.5

25.

Evite as seguintes funes: .................................................................................... 13


Incorreto ......................................................................................................... 13

26.

Use os atributos HINTS e DisplayName no cfcomponent e cffuncion................ 14

27.

No use a funo ParameterExists........................................................................ 14

28.

Declare Variveis com o Escopo VAR................................................................... 14

Exemplo: ........................................................................................................................ 14
29.

Uso de Comparaes de Forma Booleana ............................................................ 15

Exemplo: ........................................................................................................................ 15
30.

Uso da tag CFSILENT........................................................................................... 15

Exemplo: ........................................................................................................................ 15
31.
Use o atributo OUTPUT das tag CFFUNCTION e CFCOMPONENT como NO
ou FALSE. .......................................................................................................................... 16
Exemplo: ........................................................................................................................ 16
32.

CFARGUMENT..................................................................................................... 16

Exemplo: ........................................................................................................................ 17
33.

Use o atributo timeout na tag CFQUERY............................................................. 17

34.

Link para Documentao ColdFusion MX 7........................................................ 17

Correios DESIN / GEWB

Verso 1.5

1. Uso de Cerquilhas
Utilize cerquilhas s quando necessrias. Elas aplicadas incorretamente aumentam o
processamento da pgina.
Exemplo:
<cfset variables.x=#variables.y#+1> (Errado)
<cfset variables.x=variables.y+1>

(Certo)

2. Use Escopo de Variveis


Utilize sempre o prefixo de variveis. Use, por exemplo, form.teste, em vez de teste,
para reduzir o tempo de processamento que o ColdFusion precisa para avaliar a
varivel. Caso voc no use os prefixos, as variveis sero avaliadas na seguinte
ordem:
1. Function local (UDFs and CFCs only)
2. Arguments
3. Variables (local scope)
4. CGI
5. Cffile
6. URL
7. Form
8. Cookie
9. Client
Obs: Usando o prefixo, voc elimina a possibilidade de conflito de variveis.

Correios DESIN / GEWB

Verso 1.5

3. Faa cache de consulta sempre que possvel.


O cache de consulta permiti recuperar os conjuntos de resultados de consulta da
memria, em vez de requisitar toda vez o banco de dados. Isso pode reduzir
significativamente a quantidade de tempo necessria para retornar um conjunto de
resultados no seu aplicativo. O cache pode ser feito usando a tag CFQUERY e um
destes atributos: CACHEDAFTER ou CACHEDWIDTHIN.
O cache de consulta til nas situaes em que voc precisa executar
repetidamente a mesma consulta para obter um conjunto de resultados que
permanece esttico por um perodo de tempo conhecido.
Exemplos:
-

Uma consulta que recupera o preo do fechamento da ao de uma empresa


em um site de Intranet de muito trfego que atualizado uma vez por dia;

Uma consulta que recupera uma lista de novidades que atualizada uma
vez por dia.

4. Listas longas de CFELSEIF


Se voc deparar com uma longa lista de CFELSEIF o melhor seria fazer o uso do
CFSWITCH. O CFSWITCH pode ser at 7 (sete) vezes mais rpido que CFIF.
5. SQL e COLDFUSION
O SQL e o ColdFusion compartilham muitas funes similares. Muitos dos
desenvolvedores acham mais fcil usar as funes do ColdFusion., mas muito mais
eficiente para o SQL executar essas funes. Existem muitas funes do SQL iguais
s do ColdFusion. Exemplo: UCASE, YEAR e etc.

Correios DESIN / GEWB

Verso 1.5

6. Uso de CFOUTPUT ao CFLOOP


Sempre que possvel prefira o CFOUTPUT ao CFLOOP. O CFLOOP bem
mais lento.
7. Uso de Listas e Arrays
As listas so simples de usar, mas no so rpidas como os arrays. De fato, arrays so
3 vezes mais rpidos que listas. Portanto, prefira-os.

8. Uso de CFQUERY
O CFQUERY existe um parmetro opcional que o NAME. Evite us-lo nas querys
que no possuam retorno (Insert, Delete e Update), para que no crie variveis
desnecessrias de cache ou at mesmo a sobreposio de variveis que j estejam
corretamente no cache.

Correios DESIN / GEWB

Verso 1.5

9. Qual a diferena entre <CFIF IsDefined("var")> e <CFIF IsDefined("var") IS


"Yes">?
Pelo lado funcional, nenhuma - eles funcionam exatamente da mesma forma.
IsDefined() retorna YES ou NO (ou true ou false) e se voc no especificar o que
est comparando ColdFusion deduz que voc est checando por YES. Mas se for
pensar em performance, existe sim uma diferena: ao no especificar o comparador
(YES ou NO) voc ter uma performance 10% mais rpida. O mesmo verdadeiro
para qualquer comparao. Se voc puder omitir o valor de comparao, omita.
10. Use sempre o CFAPPLICATION para:
-

A manuteno do estado fornecendo um meio de criar variveis de


aplicativo, cliente e sesso;

A definio das constantes de aplicativo, tais como os nomes de fonte de


dados, os diretrios-fonte e os elementos de estilo;

O tratamento de erros que ocorrem dentro do seu aplicativo;

Fornecer mensagens de erro personalizadas;

O fornecimento de servios de segurana, tais como a autenticao e os


direitos de usurio.

11. Quando devemos usar <CFLOCK>?


A funo da tag <CFLOCK> a de controlar o acesso simultneo de um pedao de
cdigo ou mesmo de um escopo inteiro de varivel. Verses anteriores do
ColdFusion (pr CFMX) tinham uma limitao em que acessos simultneos no
protegidos variveis compartilhadas (como SESSION ou APPLICATION) podiam
resultar em acessos indevidos memria do servidor e, como conseqncia, falha do
mesmo. Isso j no acontece com o ColdFusion MX, porm ainda existem casos
onde devemos usar a tag <CFLOCK>. Primeiramente qualquer cdigo que no
feito para acesso multi-usurio (tags de terceiros, acesso a arquivos de sistema, etc)
deve ser protegido para garantir o acesso de forma seqenciada (em oposio ao
Correios DESIN / GEWB

Verso 1.5

acesso concorrente). Depois, mesmo que o acesso variveis compartilhadas no


cause problemas no servidor, ele pode causar problemas de inconsistncia na sua
aplicao. Por exemplo, se uma aplicao atualiza um valor de uma varivel do tipo
APPLICATION e o cdigo para esta atualizao no est protegido com o lock,
existe a possibilidade de usurios acessarem valores antigos (ainda no atualizados) e
ao mesmo tempo valores novos (j atualizados). Talvez isso no seja um problema,
dependendo da sua aplicao, porm se isso estiver afetando-a, o caso de usar
<CFLOCK>.
12. Qual a diferena entre locks do tipo EXCLUSIVE e do tipo READONLY?
<CFLOCK> suporta dois tipos de locks, EXCLUSIVE e READONLY. Um lock do
tipo EXCLUSIVE protege um bloco de cdigo contra qualquer acesso simultneo. J
um lock do tipo READONLY , na verdade, muito mais uma "flag" que marca se
determinado bloco pode ou no ser executado, dependendo da existncia um lock do
tipo EXCLUSIVE ativo no momento. importante usar o READONLY no seu
cdigo porque sem ele o ColdFusion pode acessar este bloco de cdigo mesmo
quando existir um lock EXCLUSIVE ativo. Isso acontece obviamente porque o
ColdFusion no ter como saber se o bloco pode ou no ser acessado naquele
momento.
13. Utilizando datas no SQL
Todas as vezes que for passar uma data via SQL (utilizando drive ODBC), use a
funo CreateODBCDate() para format-la corretamente. Isso se aplica a todas as
clusulas (INSERT, UPDATE, WHERE, HAVING, etc). O uso desta funo elimina
erros de converso de data.
14. Execuo de rotinas com espao de tempo definido (CFSCHEDULE)
Para executar rotinas com datas pr-marcadas, como por exemplo para limpar um
banco de dados, no utilize <CFSCHEDULE>. A maioria dos bancos de dados

Correios DESIN / GEWB

Verso 1.5

cliente-servidor suporta o timed execution do SQL e eles faro o trabalho com uma
performance muito superior.
15. Certificando a Consistncia dos Dados
Dados devem ter consistncia. Abreviaes, nmeros de telefone, etc, devem ser
guardados no banco de uma maneira consistente. Sim, muito fcil usar Ucase() e
outras funes para manipular dados, contudo, elas no so eficientes e tampouco
seu cdigo poder ser aproveitado utilizando outro cliente. A maneira correta de
reforar a consistncia dos dados no prprio banco, utilizando triggers ou stored
procedures.
16. Checando tempo de execuo do cdigo
Precisa checar o tempo de execuo de algumas linhas de cdigo? Voc pode faz-lo
utilizando

funo

variables.Inicio=GetTickCount()>

GetTickCount().
antes

do

Adicione
cdigo

<cfset
e

<cfset

variables.fim=GetTickCount()> no final do cdigo a ser testado. O resultado ser a


diferena entre a varivel fim e a varivel inicio. Com isso voc verificar a
perfomance da sua pgina.
17. Validao Cliente X Validao Servidor
Validaes de formulrio do lado do cliente so timas para os usurios, contudo,
no conte apenas com elas. Browsers antigos, problemas de conexo, opes de
browser desativadas e outras situaes podem fazer com que seu script no seja
executado e sem a execuo do script voc fica sem validao, sendo assim, use
validaes do lado do cliente mas nunca conte apenas com elas faa sempre
validaes do lado do servidor quando submeter o formulrio.

Correios DESIN / GEWB

Verso 1.5

18. Use Stored Procedures


Se o seu banco de dados suporta o uso de stored procedures (e deveria) use-as.
Stored procedures so em sua maioria mais rpidas, mais seguras, alm de muitos
outros benefcios.
19. Use <CFQUERYPARAM>
Sempre que voc utilizar uma varivel ColdFusion em uma expresso de SQL,
passe-a com <CFQUERYPARAM>. Essa tag aumenta a performance.
Exemplo:
<cfquery name="request.qry" datasource="dsn">
select a, b, c
from tabela1
where a = <cfqueryparam cfsqltype="CF_SQL_NUMERIC"
value="#form.variavel#">
</cfquery>
20. Respeite as palavras reservadas ao SQL
Todas as implementaes do SQL possuem palavras reservadas, palavras que
possuem um significado especial para o banco de dados. Seja bastante cuidadoso e
respeite essas palavras reservadas caso contrrio seu aplicativo comear a fazer
coisas engraadas quando voc menos esperar.
21. Nunca assuma a existncia de uma varivel
Nunca assuma que uma varivel existe, mesmo que voc mesmo tenha escrito o
cdigo que passa a varivel (quem sabe como um parmetro de URL ou um campo
de formulrio). Para sua segurana, use uma lista de tags <CFPARAM> para
inicializar todas as variveis. Se elas realmente existem a tag <CFPARAM> ser
ignorada, ou seja, o uso desta tag no tem pontos negativos e traz muitas vantagens.

Correios DESIN / GEWB

Verso 1.5

22. Use a funo LEN() para testar valores vazios.


Quando precisamos testar um valor igual a vazio (nulo), use LEN() ao invs de is
not, eq, neq e is. Vou poder usar LEN(TRIM()) para testar valores que podem
conter espaos.
Exemplo:
Ruim - <cfif variavel is not >
tima - <cfif len(trim(variavel))>
23. Use a funo CompareNoCase() para comparar duas Strings
Quando precisar comparar duas strings, muito mais rpido usar CompareNocase()
ao invs de is, eq, neq ou is not.
Exemplo:
Ruim - <cfif variavel is not qualidade></cfif>
tima - <cfif ComparenoCase(variavel, qualidade)></cfif>

Correios DESIN / GEWB

Verso 1.5

24. Evite usar ASPAS em nmeros


No use ASPAS ao se referir a nmero.
Exemplo:
Ruim - <cfset variavel = 1> - <cfset variavel = 1>
tima - <cfset variavel = 1>
25. Evite as seguintes funes:
Voc deve evitar as funes listadas abaixo. Tendem a ser lenta, difcil de serem
lidas, ou produzem resultados inesperados. Use outras (ou reescreva simplesmente
seu cdigo para evitar o uso da funo).
EVITE
Evaluate()
IIF()

USE
Reescreva o seu cdigo para evitar o uso desta funo
Incorreto
<cfset color = IIF(x IS 5, DE("red"), DE("blue"))>
Resoluo
<cfif x IS 5>
<cfset color = "red">
<cfelse>
<cfset color = "blue">
</cfif>

StructFind()

Struct.Key

IncrementValue()

Incorreto
<cfset x = IncrementValue(x)>

Resoluo
<cfset x = x + 1>

SetVariable

Incorreto
<cfset SetVariable("a", 8)>
Resoluo
<cfset a = 8>

Correios DESIN / GEWB

Verso 1.5

26. Use os atributos HINTS e DisplayName no cfcomponent e cffuncion


Use os atributos Hint e DisplayName para documentar os seus CFCs e as suas
Functions. Eles auxiliam na documentao.
27. No use a funo ParameterExists
A funo ParameterExists foi retirada na verso CF4. Substitua-a por
IsDefined(variavel).
Exemplo:
Uso incorreto
<cfif ParameterExists(variavel)>
alguma coisa.
</cfif>

Correto.
<cfif IsDefined("variavel">
alguma coisa.
</cfif>

28. Declare Variveis com o Escopo VAR.


Nos arquivos .cfc use sempre escopo de varivel. Lembrando que as declaraes
das variveis devem ficar logo aps os argumentos. No se esquea de evitar o uso
da tag CFPARAM nos arquivos cfc, pois perde performance.
Exemplo:
<cfset var variavel = "qualidade">
<cfset var qryTeste = "">
<cfoutput>#variavel#</cfoutput>
<cfquery name="qryTeste">
</cfquery>

Correios DESIN / GEWB

Verso 1.5

29. Uso de Comparaes de Forma Booleana


Exemplo:
Incorreto
<cfif IsDefined("url.id") IS "no">
<cfif request.query.recordcount GT 0>
Soluo
<cfif NOT IsDefined("url.id")>
<cfif request.query.recordcount>

30. Uso da tag CFSILENT


A tag CFSILENT suprime toda a exibio produzida entre os pares da tag
CFSILENT. CFSILENT pode suprimir o espao em branco gerado pelas pginas
em ColdFusion. A tag deve ser usada quando no necessria nenhuma exibio.
Isso tpico em loopings, querys, comentrios, criao de variveis (CFSET,
CFPARAM), entre outros.
Exemplo:
Sem o uso do CFSILENT
<cfloop index="variables.i" from="1" to="1000">
<cfset variables.i=variables.i+1>
</cfloop>
<cfquery name="variables.qry" datasource="DBQUALIDADE">
SELECT CAMPO FROM TABELA
</cfquery>
<cfoutput>#variables.i#</cfoutput>
Tamanho do Arquivo: 4,91 KB

Com o uso do CFSILENT


<cfsilent>
<cfloop index="variables.i" from="1" to="1000">
<cfset variables.i=variables.i+1>
</cfloop>
<cfquery name="variables.qry" datasource="DBQUALIDADE">
SELECT CAMPO FROM TABELA
</cfquery>

Correios DESIN / GEWB

Verso 1.5

</cfsilent>
<cfoutput>#variables.i#</cfoutput>

Tamanho do Arquivo: 26 bytes


31. Use o atributo OUTPUT das tag CFFUNCTION e CFCOMPONENT como
NO ou FALSE.
Usando o atributo output como No ou False, o ColdFusion faz uso da tag
CFSILENT implicitamente. Isso suprime todo o espao em branco gerado pelo
CFC.

Exemplo:
<cfcomponent output="No">
</cfcomponent>
<cffunction output="No">
</cffunction>

32. CFARGUMENT

Sempre informe o atributo TYPE na tag CFARGUMENT. Tente enviar o


tipo ANY.

Se o argumento obrigatrio (required=true), no especifique o atributo


DEFAULT.

Se o argumento no obrigatrio, especifique o atributo Default ou o


atributo required=false, mas no ambos.

Se voc precisa detectar se um argumento que no obrigatrio foi passado


ou no, use structKeyExists(arguments,"argName") ao invs do
atributo DEFAULT=.

Correios DESIN / GEWB

Verso 1.5

Exemplo:
Errado
<cfargument name="argErrado
type="string" required="false" default="teste" />
<cfargument name="erradissimoArg" type="string" required="true" default="teste2" />

Certo
<cfargument

name="esseRequerido"

type="string"

required="true" />

<cfargument name="esseNaoRequerido" type="string" required="false" />


<cfargument name="esseTemDefault"
type="string" default="Qualidade"/>

33. Use o atributo timeout na tag CFQUERY


Nmero mximo de segundos que cada ao (Insert, Update, Delete e Select)
permitida para executar antes de retornar um erro. Esse atributo evita que a query seja
executada por um tempo indeterminado. Quando o tempo informado no atributo exceder, o
banco de dados cancela a ao. Tempo sugerido: 120 segundos

34. Link para Documentao ColdFusion MX 7.


http://sac0119/cfdocs/dochome.htm

Correios DESIN / GEWB

Verso 1.5