Flex/AS3 – Truques e Dicas #6 – Operador Condicional ?

Flex/AS3 – Truques e Dicas #6 – Operador Condicional ?

Não é uma pergunta, mas sim mais uma dica para optimização de código e serve também para explicação deste estranho operador: ? (sim, é um ponto de interrogação!).

O operador condicional (?) pode ser usado para optimizar código e nos poupar algumas linhas, e junto com alguns outros pontos, pode reduzir o nosso código em mais de 50%, como no exemplo, que passará de 12 linhas para 3. Mas vamos então ao exemplo.

Imaginem uma função de comparação com o if:

[coolcode] private function compara(num1:int, num2:int):String {
var res:String=””;
if(num1>num2) {
res=”num1 é maior que o num2″;
}
else if(num1==num2) {
res=”num1 é igual ao num2″;
}
else {
res=”num1 é menos que o num2″;
}
return res;
}
[/coolcode]

Neste código, apesar de tudo estar correcto, conta com 11 linhas, podemos optimiza-lo de algumas maneiras, poupando bastantes linhas de código, veja:

[coolcode] private function compara(num1:int, num2:int):String {
var res:String=””;
if(num1>num2) res=”num1 é maior que o num2″;
else if(num1==num2) res=”num1 é igual ao num2″;
else res=”num1 é menos que o num2″;
return res;
}
[/coolcode]
Como apenas fazermos uma operação se a comparação for verdadeira, não precisamos dos {} em cada condição, mas isto ainda pode ser mais optimizado, usando o Operador Condicional, identificado com um ?. Este operador permite-nos eliminar os if’s, reduzindo o nosso código, vejam um exemplo simples:

[coolcode] private function compara(num1:int, num2:int):String {
if(num1>num2) return “num1 é maior que o num2″;
else return “num1 é menor ou igual ao num2″;
}
[/coolcode]

Usando o operador condicional nesta simples função (podiamos fazer o return imadiato na função anterior também), a mesma operação traduz-se assim:

[coolcode] private function compara(num1:int, num2:int):String {
var res:String=””;
num1>num2 ? res=”num1 é maior que o num2″ : res=”num1 é menor ou igual ao num2″;
return res;
}
[/coolcode]

Faz exactamente a mesma coisa, executando a ordem se num1>num2 então se se confirmar o res fica igual a num1 é maior que o num2 se não se confirmar o res fica igual a num1 é menor ou igual ao num2. Mas neste caso existe a necessidade de usar uma variavel para retorno.
O que acaba por contar com as mesmas linhas, mas imaginem a nossa função anterior, e pode até confundir, mas continuando a explicar, vejam 2 operadores condicionais em uso na mesma função, como na anterior:
[coolcode] private function compara(num1:int, num2:int):String {
var res:String=””;
if(num1>num2) res=”num1 é maior que o num2″;
else if(num1==num2) res=”num1 é igual ao num2″;
else res=”num1 é menos que o num2″;
return res;
}
[/coolcode] Que pode ser traduzida em:
[coolcode] private function compara(num1:int, num2:int):String {
var out:String=””;
num1>num2 ? out=”num1 é maior que o num2″ : num1==num2 ? out=”num1 é igual ao num2″ : out=”num1 é menor que o num2″;
return out;
}
[/coolcode]

Confuso hein? Mas este código faz exactamente o mesmo que a função anterior fazendo todas as comparações que os 2 if’s fariam antes, mas em apenas uma linha.

Mas estão voces a pensar, ah, mas as linhas são as mesmas se fizesse:
[coolcode] private function compara(num1:int, num2:int):String {
if(num1>num2) return “num1 é maior que o num2″;
else if(num1==num2) return “num1 é igual ao num2″;
else return “num1 é menos que o num2″;
}
[/coolcode] Está certo, mas nesse caso também poderiamos fazer:
[coolcode] private function compara2(num1:int, num2:int):String {
return num1 > num2 ? “num1 é maior que o num2″ : num1==num2 ? “num1 é igual ao num2″ : “num1 é menor que o num2″;
}
[/coolcode]

Certo?
Resumindo, de uma função de 12 linhas passamos para uma função com apenas 3 linhas. :)

Este operador pode não ser uma boa alternativa ao if porque pode causar confusão, mas serve para diminuir o código em algumas linhas, principalmente para reduzir ao minimo os if’s menos necessários…

Abraço.


6 comments

add yours
  • Jorge April 6, 2009

    Para quê fazer “num1 > num2 && num1!=num2″? Se num1 é maior que num2, então ele é necessariamente diferente de num2. A segunda parte da condição não está ali a fazer nada.

  • Mário Santos April 6, 2009

    Boas jorge,

    hauhauha, é verdade, na realidade só faria sentido ao contrário, falha minha, :=p corrigido! :)

  • Pedro Cardoso April 7, 2009

    Faria sentido ao contrário, como?

    Existe também o >= e <=.

    Alguém anda a faltar às aulas de matemática:)

  • Mário Santos April 7, 2009

    Assim:
    if(num1!=num2 && num1>num2) Desta forma são as duas comparações válidas, já que o ser diferente não quer dizer que seja obrigatóriamente maior…

    Claro que o >= também serviria, mas o meu objectivo era mostrar uma comparação para os 3 casos, maior, menor ou igual separadamente.

    Se colocasse >= teria que fazer a comparação que fiz depois (if (num1==num2)) o que vai dar ao mesmo.

    Quanto às aulas de matemática… lol… às vezes não têm a ver com saber ou não matematica, neste caso têm a ver com a lógica com que fiz o exemplo, criando inicialmente apenas a comparação menor ou maior, e depois, erradamente, adicionar a comparação de igualdade, sem tomar atenção à comparação existente (maior que).

  • Jorge April 7, 2009

    Bom dia Mário!

    Tu dizes que “if(num1!=num2 && num1>num2) Desta forma são as duas comparações válidas, já que o ser diferente não quer dizer que seja obrigatoriamente maior…”

    Válidas, sim, mas a primeira continua a ser desnecessária. Diferente não que dizer que seja necessariamente maior, correcto, mas maior implica necessariamente que seja diferente, logo a primeira está contida na segunda, tornando a primeira desnecessária.

    Repara bem no teu próprio código:
    if(num1!=num2 && num1>num2) return “num1 é maior que o num2″;
    ou
    num1!=num2 && num1 > num2 ? “num1 é maior que o num2″

    O que tu queres saber é se num1 é maior do que num2, e para isso a condição num1>num2 é mais do que suficiente.

  • Mário Santos April 7, 2009

    oupa, acordei pra verdade… :P

    Sim, foi falta de lógica na minha interpretação, e a tua analise:

    “mas maior implica necessariamente que seja diferente, logo a primeira está contida na segunda, tornando a primeira desnecessária.”

    Está correctissima, é mesmo desnecessária, não errada, mas desnecessária…

    …Parece que faltei mesmo a essa aula de matemática… uhuha

    Thks aos 2 pelo reparo. :)

Leave a Comment

Post