Pergunta

No código da minha empresa, muitas vezes vi arquivos de componentes usados ​​ao inicializar um objeto desse componente e chamar os métodos do objeto.No entanto, parece-me um pouco mais simples usar o método cfinvoke, especialmente quando se usa apenas um método do arquivo do componente.Quais são as diferenças entre esses 2 métodos de chamar uma função de componente e quais são os prós/contras de cada um?Quando devo usar qual?

Foi útil?

Solução

cfinvoke só pode ser usado em tags.

createObject pode ser usado em tags e cfscript e tende a ser um pouco mais fino/fácil de ler IMO.

Até recentemente, eu evitava usar cfinvoke porque o achava "volumoso", mas uma vantagem disso é que você pode fazer um loop dinâmico sobre os métodos dentro de um CFC.Em createobject você não pode.

Então, se por exemplo eu tenho um CFC que possui os métodos - método1, método2, método3, método4.Posso fazer um loop sobre eles assim: -

<cfloop from="1" to="4" index="element">
   <cfif structKeyExists(this,'getMethod#element#')>
<cfinvoke component="#this#" method="getLine#local.element#" returnVariable="methodValue"></cfinvoke>
<cfset arrayAppend(myArray,methodValue) />
   </cfif>

--

Outra coisa a notar é que alguns hosts de compartilhamento bloqueiam o createobject.Principalmente pelo acesso que dá ao Java sublinhado.

Outras dicas

Um outro benefício de usar createObject() é que você pode encadear o init() método, por ex.

<cfset myObject = createObject("com.path.MyObject").init() />

E se o seu init() retorna this você pode ir além e encadear o método se não precisar usar o objeto novamente:

<cfset functionResults = createObject("com.path.MyObject").init().myFunction() />

Vale ressaltar que no CF 9 você pode usar o novo (ahem) new sintaxe para criar objetos.Por exemplo, para criar o mesmo objeto acima e chamá-lo init() Eu consigo escrever:

<cfset myObject = new com.path.MyObject() />

É legal e gosto da opção de fazer isso.CF está se movendo na direção certa, na minha opinião, com recursos como esse.

Você quase respondeu sozinho:superficialmente, pode-se dizer que, se você chamar apenas um método em uma página, fazer sentido de uma só vez no CFINVOKE (que instancia o CFC e chama o método nomeado).E certamente se você chamar mais de um método do CFC em uma página, então separar as etapas faz sentido (instancie o CFC com a função createobject ou tag cfobject e, em seguida, invoque métodos encontrados nesse objeto, um ponteiro para o CFC) , para que você não pague esse custo de instanciação mais de uma vez.

Mas tenha em mente que se a página for chamada com frequência, pode fazer sentido também salvar o resultado da instanciação do CFC, para que possa ser reutilizado em uma solicitação subsequente à página.Você faria isso armazenando-o (o resultado de cfobject/createobject) não em uma variável local, mas em um escopo compartilhado:seja servidor, aplicativo ou sessão, com base em "quem" se beneficiaria com tal reutilização.É claro que cabe a você manipular/decidir programaticamente por quanto tempo salvar essa instância CFC "em cache".

Tão importante quanto, quando você salva uma instância CFC dessa forma, você se torna mais suscetível ao "bug de escopo var", que basicamente é que você precisa ter ainda mais cuidado ao VAR quaisquer variáveis ​​locais criadas no CFC.Em vez de tentar elaborar mais sobre isso, apontarei um meta-recurso que criei sobre isso:

http://www.carehart.org/blog/client/index.cfm/2010/3/4/resources_on_the_var_scope_problem

Espero que ajude.

Em vez de refazer esta discussão, vou apenas indicar o Google:

http://www.google.com/search?q=cfinvoke+vs+createobject

Existem algumas diferenças sutis (ou seja: <cfinvoke> é capaz de lidar com nomes de métodos dinâmicos), mas essencialmente tudo se resume à preferência pessoal.Bem, isso e o fato de que você não pode usar <cfinvoke>através da <cfscript>.

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