ColdFusion:É seguro deixar de fora as variáveis de palavra-chave em um CFC?

StackOverflow https://stackoverflow.com/questions/59390

  •  09-06-2019
  •  | 
  •  

Pergunta

Em um Componente ColdFusion (CFC), é necessária a utilização de nomes totalmente qualificados para as variáveis escopo de variáveis?

Eu estou indo para obter-me em problemas se eu alterar isso:

<cfcomponent>
    <cfset variables.foo = "a private instance variable">

    <cffunction name = "doSomething">
        <cfset var bar = "a function local variable">
        <cfreturn "I have #variables.foo# and #bar#.">
    </cffunction>
</cfcomponent>

para este?

<cfcomponent>
    <cfset foo = "a private instance variable">

    <cffunction name = "doSomething">
        <cfset var bar = "a function local variable">
        <cfreturn "I have #foo# and #bar#.">
    </cffunction>
</cfcomponent>
Foi útil?

Solução

Não importa para especificar variáveis de "" quando você criar a variável, porque foo será colocado no espaço das variáveis por padrão;mas que importa quando você acessar a variável.

<cfcomponent>
    <cfset foo = "a private instance variable">

    <cffunction name="doSomething">
        <cfargument name="foo" required="yes"/>
        <cfset var bar = "a function local variable">
        <cfreturn "I have #foo# and #bar#.">
    </cffunction>

    <cffunction name="doAnotherThing">
        <cfargument name="foo" required="yes"/>
        <cfset var bar = "a function local variable">
        <cfreturn "I have #variables.foo# and #bar#.">
    </cffunction>

</cfcomponent>

doSomething("args") retorna "eu tenho args e um função de variável local"

doAnotherThing("args") retorna "eu tenho uma instância particular de uma variável e um função de variável local."

Outras dicas

Eu vou dizer que Sim.É explicitamente necessário?Não.Você pode começar afastado com não fazê-lo?Com certeza.Você está pedindo para ter problemas?Absolutamente.Se você tem o seguinte dentro de uma cffunction:

<cfset foo = "bar" />

Que não vai colocar essa variável em função do local var escopo, ele vai colocá-lo no CFC global de VARIÁVEIS de escopo, o que significa que ele está disponível para cada método do CFC.Há momentos em que você pode querer fazer isso, mas a maioria do tempo que você estaria pedindo uma condição de corrida.

Quando a variável está a ser lido pelo servidor, se essa variável não é explicitamente declarada como parte de um escopo (SOLICITAÇÃO., SESSÃO., etc.) em seguida, ColdFusion será executado ScopeCheck() para determinar o escopo da variável é de.Isso não é apenas colocar uma sobrecarga desnecessária no servidor de aplicativos, ele também apresenta a capacidade de seqüestro, em que a variável está em um escopo, mas ScopeCheck() encontrou uma variável com o mesmo nome superiores na ordem de precedência.

Sempre, sempre, SEMPRE, escopo de todas as variáveis.Não importa o quão trivial.Mesmo coisas como nomes de consulta e o ciclo de índices.Salvar a si mesmo, e aqueles que vêm atrás de você, da dor.

Especialmente no Cfc, adequada delimitação é importante.O extra "verbosidade" vale a pena a clareza.Ter variáveis de escorregar para fora de suas indended escopo irá causar problemas graves e muito difícil de diagnosticar.

Verbosidade nem sempre é uma coisa ruim.Temos o nome do nosso funções e métodos descritivo maneiras como getAuthenticatedUser(), em vez de gau().Colunas de banco de dados e tabelas são melhores esquerda descritivo, como EmployeePayroll, ao invés de incluir empprl.Assim, sendo concisa pode ser 'mais fácil' quando a sua memória de curto prazo é cheio de detalhes do projeto, mas de ser descritivo mostra a sua intenção e é útil durante a fase de manutenção de uma aplicação, muito tempo depois de sua memória de curto prazo tem sido preenchido com outras coisas.

A resposta curta para a sua pergunta é que não, você provavelmente não irá correr em apuros tentando fazer isso.Fora do contexto da UDF (mesmo ainda dentro de um CFC), um onu escopo do conjunto de instrução implica a variáveis de escopo.

Além disso, em um CFC, as Variáveis de escopo está disponível para todas as suas funções;ele é o tipo de escopo global dentro de CFC, similar a "este" âmbito, excepto o espaço das variáveis é semelhante ao "privado" variáveis, considerando que a este âmbito é semelhante a variáveis públicas.

Para testar isso, crie teste.cfc:

<cfcomponent>
    <cfset foo = "bar" />
    <cffunction name="dumpit" output="true">
        <cfdump var="#variables#" label="cfc variables scope">
        <cfdump var="#this#" label="cfc this scope">
    </cffunction>
</cfcomponent>

e uma página para teste, teste.cfm:

<cfset createObject("component", "test").dumpit() />

E os resultados serão:


Agora, para resolver outro problema que eu vejo em seu código de exemplo...

Na FC, todas as Funções Definidas pelo Usuário de ter um especial da onu-chamado de escopo comumente referido como o "var" âmbito de aplicação.Se você fizer o seguinte dentro de uma UDF:

<cfset foo = "bar" />

Então você está dizendo a CF para colocar essa variável para o var de escopo.

Para piorar um pouco as coisas, você pode executar em problemas (valores de variáveis de mudar quando você não estava esperando que eles) quando você estiver não utilizando o var escopo em seu inline UDFs.

Por isso, a regra de ouro é para sempre, Sempre, SEMPRE, SEMPRE var-escopo de sua função de variáveis internas (incluindo nomes de consulta).Há uma ferramenta chamada varScoper que irá ajudá-lo a encontrar variáveis que precisa ser var escopo.Na última vez que verifiquei que não era perfeito, mas é definitivamente um começo.

No entanto, é um ruim idéia de referência (exibir/usar) as variáveis sem um escopo (obviamente com exceção de var com escopo de variáveis, como você não pode especificar o escopo de ler) no Cfc ou até mesmo no seu padrão CFM páginas.Como de CF7, houve 9 escopos que foram verificados em uma ordem específica quando você lê uma variável sem especificar o escopo, a primeira partida ganha.Com CF8, não poderia ser mais escopos, na lista, eu ainda não verificada.Quando você fizer isso, você corre o risco de receber um valor a partir de um escopo quando você está esperando-lo a partir de outro;o que é um pesadelo para depurar...Eu lhe garanto.;)

Assim, em breve: o que implica uma variável de escopo (em conjunto) não é uma idéia terrível (que eu geralmente especificar, de qualquer jeito);mas inferindo variável de escopo (em leitura) está pedindo para ter problemas.

Não explicitamente delimitação do âmbito de aplicação no espaço das variáveis podem funcionar, mas não é uma boa idéia, e, honestamente, a única razão não é por preguiça IMO.Se você explicitamente o escopo tudo 1) evitar potenciais problemas, e 2) torna o código mais fácil de ler, porque não há dúvida de que o escopo que as coisas são.

Para mim, isso não torna o código mais detalhado (e, certamente, não desnecessariamente verbose)--na verdade é mais fácil de ler, evita a confusão, e evita estranho efeitos colaterais que podem surgir se você não explicitamente escopo.

A resposta simples para sua pergunta é:"NÃO, isso não é necessário"

No entanto, eu acho que as melhores práticas gostaria de sugerir que você faça, na verdade, usam as variáveis indentificador ao acessar essas variáveis.Na minha opinião qualquer um que vier ao seu código no futuro, e está à procura do meio de uma função, vai saber instantaneamente o escopo da variável sem ter de digitalizar o topo da função a funções locais.

Na verdade, eu adicione um pouco mais de detalhamento para o meu CFC UDFs através da criação de uma estrutura local:

<cfset var="" local="structNew()" />

Então eu coloquei todos os meus local vars em que estrutura e referenciá-los dessa forma para o meu código será algo parecido com isso:

<cfset local.foo="variables.bar" +="" 10="" />

Depois de ler suas respostas, aqui está o que eu estou pensando:

Sim, é seguro.Em geral, não é necessário ou útil para especificar explicitamente as variáveis de escopo.Ele apenas aumenta a confusão já detalhado idioma.

Concedido, há uma pequena exceção, como Soldarnal apontou, onde a qualificação de uma das variáveis com escopo variável é necessária.Isto é, se você tem uma função de uma variável local com o mesmo nome.(Mas provavelmente você não deve fazer isso de qualquer maneira.)

Melhores práticas de lado, eu acredito que poderia também dependem de como o seu curso para acessar o seu cfc eu não tive quaisquer problemas, deixando-os para fora, quando a criação de objetos e acessá-los a partir de coldfusion.No entanto, eu acho que poderia ser necessários ao acesso e/ou mapeamento-los remotamente através de actionscript em flex/flash.

Aqui está um muito bom CFC âmbito de referência a partir de Raymond Camden.Pessoalmente, eu prefiro fazer um 'self' hash para evitar toda a confusão (repare que eu não uso o 'variáveis' âmbito das funções):

<cfcomponent>
  <cfset variables.self = structNew()>
  <cfscript>
    structInsert(variables.self, <key>, <value>);
    ...
  </cfscript>

  <cffunction name="foo">
    self.<key> = <value>
    <cfreturn self.<key> />
  </cffunction>

  ...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top