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:

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;
    
}

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:

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;
    
}


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:

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";
}

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:

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;
}

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:

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;
}

Que pode ser traduzida em:

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;
}

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:

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";
}

Está certo, mas nesse caso também poderiamos fazer:

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";
}

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.

Deixe um comentário ou um Trackback
   

6 Comentários

  1. Jorge
    April 6, 2009 às 4:52 pm | Permalink

    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.

  2. April 6, 2009 às 5:19 pm | Permalink

    Boas jorge,

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

  3. April 7, 2009 às 7:14 am | Permalink

    Faria sentido ao contrário, como?

    Existe também o >= e <=.

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

  4. April 7, 2009 às 7:25 am | Permalink

    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).

  5. Jorge
    April 7, 2009 às 9:06 am | Permalink

    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.

  6. April 7, 2009 às 9:29 am | Permalink

    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. :)

Deixe um comentário

O seu email nunca será publicado ou partilhado. Campos obrigatórios estão marcados com um *

*
*

Spam Protection by WP-SpamFree