Afinal, o que são condicionais ?
Recebi uma sugestão de post, no mínimo curiosa..
Caramba.. como assim ?
O que realmente são
Condicionais são estruturas de controle do fluxo dos nossos programas.
A grosso modo, se uma certa condição for satisfeita, então o bloco de código relativo e encadeado a essa condição deve ser executado.
<?php
date_default_timezone_set('America/Sao_Paulo');
if( date('G')>6 && date('G')<=12 )
echo 'Olá, ainda está de dia !';
else if( date('G')>12 && date('G')<=18 )
echo 'Caramba! Olha que horas são! já devo lhe dizer Boa Tarde!';
else if( date('G')>18 && date('G')<=23 )
echo 'Tá de noite!';
else if( date('G')>23 && date('G')>=6 )
echo 'Ta de "madrugada" ainda.. vai dormir!';
Dependendo da hora do dia(no servidor), será exibida uma mensagem ao visitante.
<?php
while( true ){
echo 'Eu gosto de SODA Limonada!';
}
hehe, famoso loop infinito.. sim, eu realmente adoro Soda.
Parece simples
Mas não é tão simples assim.. por mais que estejamos acostumados a programar, existem alguns “erros” que podem ser cometidos.
DRY! DIE!
A primeira forma incorreta de usar condicionais, na verdade não é ditada apenas no uso dessas estruturas, mas sim como um todo nessa ciência.
Não se repita!
Vale para tudo no desenvolvimento, porém com condicionais é ainda um pouco mais gritante:
<?php
if( isset( $_GET['user'] ) && $_GET['action']=='editar' )
{
//faz outra coisa
}
else if( isset( $_GET['user'] ) && $_GET['action']=='excluir' )
{
//faz algo
}
else if( isset( $_GET['user'] ) && $_GET['action']=='inserir' )
{
//faz algo
}
//.. continua..
Assim que batermos o olho no código, nossos olhos de programadores devem ser capazes de fazer mais ou menos isso aqui:
Ou seja, “borrei mentalmente” o que variava alí, e encherguei uma duplicação de código, uma repetição de um teste.
A resposta, para evitar essa repetição, é reagrupar logicamente os testes. Estou demonstrando esse caso simples, para exemplificar, e também ser mais fácil de mostrar aqui no post. O corretomelhor seria:
<?php
if( isset( $_GET['user'] )
{
if( $_GET['action']=='editar' )
{
//faz outra coisa
}
else if( $_GET['action']=='excluir' )
{
//faz algo
}
else if( $_GET['action']=='inserir' )
{
//faz algo
}
}//fecha if get user
//.. continua..
bem mais legível ne?!
Rapidamente conseguimos dizer que todas as ações, dependem da existência do parâmetro user na superglobal $_GET.
O resultado é o mesmo do primeiro código, só que agora está muito melhor em performance e legibilidade.
Não ser capaz de pensar no inverso
As estruturas de testes estão diretamente ligadas a lógica. As vezes é muito difícil testarmos uma coisa, e passamos horas e horas tentando.
Mais fácil seria inverter, e testar primeiro o contrário.
As minhas entradas possíveis são: bla, ble, bli, blo e blu.
O meu programa precisa fazer algo se entrar bla, ble, bli OU blo. E outra coisa se entrar blu.
O primeiro rascunho seria:
<?php
if( $ext=='bla' || $ext=='ble' || $ext=='bli' || $ext=='blo' ){
//tal coisa
}
else { //blu
//outra coisa
}
O seguinte resulta na mesma coisa:
<?php
if( $ext=='blu' ){
//outra coisa
}
else { //bla, ble, bli ou blo
//tal coisa
}
O código ficou bem mais simples ne?!
Primeiro resolvi a excessão e depois apliquei ao restante. Esse tipo de situação é mais frequente do que imaginamos.
O indicativo que podemos resolver pensando o contrário, é qndo estivermos nos diante de uma condicional absurdo e complexo. Quase sempre, existe uma forma mais simples de resolver.
Não enchergar os padrões
Podemos patinar e ficar horas tentando escrever complexos testes, se não formos capazes de identificar padrões nos testes, e até quem sabe, utilizarmos uma Expressão Regular para simplificar as coisas.
<?php
if( $q=='Localweb' || $q=='Loucaweb' || $q=='Lokaweb' || $q=='LokaWeb' ){
//se o visitante queria digitar Locaweb, mas errou algum pedaço..
echo 'Você tentou digitar Locaweb, mas digitou: '.$q;
}
Existem as mais diversas e loucas variações para as tentativas, porém todos concordam que começa com L, e termina com web.
Além disso, case insensitive não deve importar, pois seria absurdo testarmos todas as possibilidades.
Uma expressão regular tira isso de letra:
js
/l[a-z]+web/i
Depois vá refinando.
Citei algumas aplicações com if(), porém o mesmo princípio pode ser aplicado a switch case(prefira esse do que uma cadeia de if/elses), while()… enfim, essas estruturas condicionais que testam algo, para então fazer tal coisa.
E você ? tem mais alguma dica ? ou situação inusitada/complicada com condicionais ?