A lógica da usabilidade do switch no ColdFusion é praticamente a mesma das demais linguagens, apenas com uma ressalva de que o CF tem por natureza uma notação bastante singular.
Certamente você já sabe que o switch no CF é chamado através do termo cfswitch, mas o que talvez não saiba é que não é necessário utilizar o break em cada case, assim como é feito no PHP e no JavaScript, por exemplo.
O switch é importante quando existe uma cadeia de validações a serem feitas. Portanto ao invés de utilizar um IF com vários ELSE IFs, prefira sempre utilizar o switch. É mais performático e melhor estruturado, beneficiando a leitura do seu código.
Vamos a um exemplo:
<cfswitch expression="Bugatti"> <cfcase value="Bugatti">Ótima escolha!</cfcase> <cfcase value="Ferrari">Boa escolha!</cfcase> <cfcase value="Fusca">Péssima escolha!</cfcase> </cfswitch>
O atributo expression da tag cfswitch recebe qual o valor será testado pelo switch e sua cadeia de cases;
Como o próprio nome sugere, o termo "cfcase" é o case ("caso" em tradução do inglês), onde será testado o valor recebido pelo atributo expression da tag cfswitch;
O atributo value das tags cfcase é o valor no qual será testado o valor registrado no atributo expression da tag cfswitch;
Neste exemplo acima, o resultado será:
Ótima escolha!
Podemos também fornecer variáveis para o cfswitch através do atributo expression:
<cfset meu_carro = "Bugatti"> <cfswitch expression="#meu_carro#"> <cfcase value="Bugatti">Você tem muito bom gosto! E muito dinheiro, diga-se de passagem...</cfcase> <cfcase value="Ferrari">Você é do clube dos mimizentos, mas tem bom gosto.</cfcase> <cfcase value="Fusca">Você é colecionador?</cfcase> </cfswitch>
A variável meu_carro está sendo instanciada com uso do cfset para guardar o carro;
Note que o valor sendo passado para o atributo expression da tag cfswitch está entre cerquilhas. É necessário fornecer o dado entre cerquilhas para que o CF interprete como uma variável e teste o valor guardado na variável, e não o nome da variável em si. Do contrário seria testado o termo "meu_carro" ao invés do termo "Bugatti";
É possível registrar um case default para quando todos os cases testados não convergem com o valor injetado no atributo expression da tag cfswitch:
<cfset meu_carro = "Bugatti"> <cfswitch expression="#meu_carro#"> <cfcase value="Bugatti">Você tem muito bom gosto! E muito dinheiro, diga-se de passagem...</cfcase> <cfcase value="Ferrari">Você é do clube dos mimizentos, mas tem bom gosto.</cfcase> <cfcase value="Fusca">Você é colecionador?</cfcase> <cfdefaultcase>Compre logo um carro!</cfdefaultcase> </cfswitch>
A tag cfdefaultcase ("caso padrão" em tradução do inglês) é responsável por resultar um valor padrão, prestabelecido de acordo com a necessidade. Seu funcionamento seria similar ao ELSE numa cadeira de IF com vários ELSE IFs;
Note que em todos os exemplos, estamos apresentando o texto livremente dentro das tags cfcase e cfdefaultcase. Todavia, se você tentar imprimir uma variável, essa variável não será identificada pelo CF. Vejamos:
<cfset meu_carro = "Ferrari"> <cfset parte_final_texto = "escolha!"> <cfswitch expression="#meu_carro#"> <cfcase value="Bugatti">Ótima #parte_final_texto#</cfcase> <cfcase value="Ferrari">Boa #parte_final_texto#</cfcase> <cfcase value="Fusca">Péssima #parte_final_texto#</cfcase> <cfdefaultcase>Você não pode fazer #parte_final_texto#</cfdefaultcase> </cfswitch>
Estamos utilizando a instância de uma variável parte_final_texto para guardar a parte da mensagem ("escolha!") que se repete em todos os cfcase;
Neste exemplo acima, o resultado será:
Ótima #parte_final_texto#
Portanto, para trabalhar com variáveis junto a textos no resultado dos cfcase, precisamos trabalhar com a boa e velha cfoutput:
<cfset meu_carro = "Ferrari"> <cfset parte_final_texto = "escolha!"> <cfswitch expression="#meu_carro#"> <cfcase value="Bugatti"> <cfoutput>Ótima #parte_final_texto#</cfoutput> </cfcase> <cfcase value="Ferrari"> <cfoutput>Boa #parte_final_texto#</cfoutput> </cfcase> <cfcase value="Fusca"> <cfoutput>Péssima #parte_final_texto#</cfoutput> </cfcase> <cfdefaultcase> <cfoutput>Você não pode fazer #parte_final_texto#</cfoutput> </cfdefaultcase> </cfswitch>
Com o uso do cfoutput podemos apresentar textos sendo construídos em conjunto com o valor de variáveis;
Dentro do cfoutput, utilizamos a variável entre cerquilhas para informar ao CF que ele deve trabalhar com o valor guardado naquela variável;
Agora por último... Prometo que será o último exemplo...
Podemos trabalhar dentro dos cfcase com quaisquer outros scripts que sejam necessários. Podemos fazer instâncias e atribuições de variáveis, e até mesmo inserir novos cfswitch. Nesse quesito o CF consegue ser bastante versátil.
Vamos a um exemplo onde de acordo com o prato escolhido, a pessoa recebe uma nota por seu bom gosto culinário:
<cfset nota = 0> <cfset parabenizacao = ""> <cfset prato_escolhido = "strogonoff"> <cfswitch expression="#prato_escolhido#"> <cfcase value="strogonoff"> <cfset parabenizacao = " Parabéns!"> <cfset nota = 10000000> </cfcase> <cfcase value="lasanha"> <cfset nota = 500> </cfcase> <cfcase value="macarrão"> <cfset nota = 100> </cfcase> <cfdefaultcase> <cfset nota = 10> </cfdefaultcase> </cfswitch> <cfoutput>Você escolheu #prato_escolhido#, e sua nota foi #nota##parabenizacao#</cfoutput>
Usamos o cfset em cada cfcase para efetuar novas atribuições de valor para a variável nota;
Usamos o cfdefaultcase para atribuir uma nota mínima como participação caso a pessoa não tenha escolhido nenhum dos pratos eleitos a pontuar;
Por fim usamos o cfoutput para apresentar uma mensagem contendo a nota que a pessoa recebeu;
Portanto o resultado deste exemplo será:
Você escolheu strogonoff, e sua nota foi 10000000. Parabéns!
Note que neste exemplo a variável parabenizacao sempre é apresentada no resultado do cfoutput, porém ela somente recebe preenchimento quando o usuário escolhe strogonoff. Se mudarmos a escolha do prato para lasanha, por exemplo, a mensagem será:
Você escolheu lasanha, e sua nota foi 500.