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




6 Comentários
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.
Boas jorge,
hauhauha, é verdade, na realidade só faria sentido ao contrário, falha minha, :=p corrigido!
Faria sentido ao contrário, como?
Existe também o >= e <=.
Alguém anda a faltar às aulas de matemática:)
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).
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.
oupa, acordei pra verdade…
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.