MelhorespraticasdesenvolvimentoCF[1]

17
  Melhores práticas para desenvolvimento em ColdFusion Correios/DESIN/GEWB  Correios – DESIN / GEWB Versão 1.5 1

description

melhores praticas coldfusion

Transcript of MelhorespraticasdesenvolvimentoCF[1]

  • Melhores prticas para

    desenvolvimento em ColdFusion

    Correios/DESIN/GEWB

    Correios DESIN / GEWB Verso 1.5

    1

  • Histrico das Revises

    Data Verso Descrio Autor 29/11/2006 1.0 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.

    Equipe Qualidade (Desun/DSNW)

    10/01/2007 1.1 - Incluso do item CFSILENT Equipe Qualidade (Desun/DSNW)

    12/01/2007 1.2 - Correo do Exemplo da Declarao do Escopo de varivel dentro de Componente (CFC).

    Equipe Qualidade (Desun/DSNW)

    17/01/2007 1.3 Incluso de 2 itens.

    - Use o atributo OUTPUT das tags CFFUNCTION e CFCOMPONENT como NO ou FALSE.

    - CFARGUMENT.

    Equipe Qualidade (Desun/DSNW)

    13/09/2007 1.4 Incluso do item timeout Equipe Qualidade (Desun/DSNW)

    18/10/2007 1.5 Incluso do valor do atributo timeout Equipe Qualidade (Desin/GEWB)

    Correios DESIN / GEWB Verso 1.5

    2

  • 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 e ? ................................................................................................................................ 8 10. Use sempre o CFAPPLICATION para: .................................................................. 8 11. Quando devemos usar ?....................................................................... 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 .................................................................................... 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

    3

  • Correios DESIN / GEWB Verso 1.5

    4

    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

  • 1. Uso de Cerquilhas

    Utilize cerquilhas s quando necessrias. Elas aplicadas incorretamente aumentam o

    processamento da pgina.

    Exemplo:

    (Errado)

    (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

    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

  • 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

    7

  • 9. Qual a diferena entre e ?

    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 ?

    A funo da tag 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 . 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

    8

  • 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

    .

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

    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 . A maioria dos bancos de dados

    Correios DESIN / GEWB Verso 1.5

    9

  • 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 a funo GetTickCount(). Adicione antes do cdigo e 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

    1

  • 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

    Sempre que voc utilizar uma varivel ColdFusion em uma expresso de SQL,

    passe-a com . Essa tag aumenta a performance.

    Exemplo:

    select a, b, c

    from tabela1

    where a =

    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 para

    inicializar todas as variveis. Se elas realmente existem a tag ser

    ignorada, ou seja, o uso desta tag no tem pontos negativos e traz muitas vantagens.

    Correios DESIN / GEWB Verso 1.5

    1

  • 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 -

    tima -

    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 -

    tima -

    Correios DESIN / GEWB Verso 1.5

    1

  • 24. Evite usar ASPAS em nmeros

    No use ASPAS ao se referir a nmero.

    Exemplo:

    Ruim - -

    tima -

    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 USE

    Evaluate() Reescreva o seu cdigo para evitar o uso desta funo

    IIF() Incorreto

    Resoluo

    StructFind() Struct.Key

    IncrementValue() Incorreto

    Resoluo

    SetVariable Incorreto

    Resoluo

    Correios DESIN / GEWB Verso 1.5

    1

  • 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

    alguma coisa.

    Correto.

    alguma coisa.

    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:

    #variavel#

    Correios DESIN / GEWB Verso 1.5

    1

  • 29. Uso de Comparaes de Forma Booleana

    Exemplo:

    Incorreto Soluo

    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 SELECT CAMPO FROM TABELA #variables.i# Tamanho do Arquivo: 4,91 KB

    Com o uso do CFSILENT SELECT CAMPO FROM TABELA

    Correios DESIN / GEWB Verso 1.5

    1

  • #variables.i#

    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:

    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

    1

  • Correios DESIN / GEWB Verso 1.5

    1

    Exemplo:

    Errado