Controladores, uma boa solução… o “C” do MVC

É certo que vivemos um momento de “boom” tecnológico, não é diferente com as linguagens de programação, cada anos nos deparamos com novos projetos de linguagens de programação. A coqueluxe do momento é o Python, que tem lá as suas vantagens que o tornaram essa “coqueluxe”, porém nada como o tempo para solidifcar ou desmitificar uma linguagem de programação.

Agora algo que se atualiza mas devagar é o modo de como aplicar/modelar e usar as linguagens, pode ser que teoricamente existão mais de 3, mas na prática só tem 3 maneiras que conhecemos a Estruturaçáo de dados (que arrastamos ainda por não termos banco de dados OO 100% OO e confiáveis no mercado, tá admito a existência dos DAOs, mas estão engatinhando ainda), a Orientação em Objetos, que não é nenhuma novidade, porém muito poderosa e com certeza veio para ficar! E a mais utilizada no mercado pela a grande maioria, maioria essa denominadas de non-professional, que é o POG, que todos sabem é a Programação Orientada a Gambiarras. Já vi muitos ótimos programadores que sabem como programar em OO, mas era maior POG, pessoas que se acham o supra sumo da programação, porém não seguem nenhum padrão nem modelo de UML, programam de uma maneira que só elas entedem e por ae vai…

Mas vamos falar de padrões, famoso termo Design Patterns, já me questionaram se o MVC seria um “Design Pattern”, disse que ideologicamente sim, mas economicamente não, pq esse termo surgiu com o “GOF” (Group of Four) que foram 4 analistas que criaram alguns padrões de projetos e os chamaram de “Padrões de Projetos”… dãaaaa… Mas que o MVC é um padrão de projeto e muito interessante.

Agora chega de blablabla e vamos aos controladores… Imaginem a cena…

Você chega no bar, se dirige ao balcão, todo arrumado limpo, agradável aos seus olhos e com convidativo, vc se dirige ao atendente e pede uma bebida exótica, essa atendente se dirige ao barman e faz seu pedido, vc espera e o atendente lhe entrega a bebida”

A “cena” supracitada (me senti um advogado agora), ilustra bem o que é um Controlador, nesse caso o atentende seria o controlador, fácil não ? Agora vamos para a nossa realidade (se é que a realidade de um programador/analista seria de fato algo real, já que “abstraimos” constatemente)… A interface gráfica de nossas aplicações “podem ser obrigatoriamente” (copiei essa frase do Guia do Mochileiro das Galáxias, hehehe), burras, extremamentes burras, “indolentemente desprovidadas de qualquer inteligência”, ou seja, não devem ser nada além de “interfaces gráficas”, no caso acima citado o atendente não precisa saber preparar a bebida, ele só precisa saber falar corretamente, no caso da programação, a GUI (interface gráfica, nao vou ficar repetindo interface gráfica vou falar só GUI agora, por sinal Graphic Interface Users), não precisa entender seu pedido só precisa enviar para quem entenda, uma Classe seria um bom exemplo, classe essa que teria que saber tudo o que a interface gráfica quer e retornar o processamento do pedido

Exemplo… Temos uma página de web com o menu, cada menu corresponde a uma tela … vamos criar entao…


<ul id="menu">
  <li><a href="?tela=tela1">tela 1</a>
  </li><li><a href="?tela=tela1">tela 2</a>
</li></ul>

<div id="lugar_onde_as_telas_vao_aparecer_mas_nao_usem_esse_nome_grande">
< ?
require_once('controladordetelas.php');

?>
</div>

Notem esse exemplo de cima to fazendo um controlador sem ser em classe simples mesmo para entedimento… e no controladordetelas.php o que fariamos


switch($_GET['tela']){
     case 'tela1':{require_once('views/tela1.php');break;}
     case 'tela2':{require_once('views/tela2.php');break;}
     default:require_once('view/telaboasvindas.php');

}

Fácil não !? Agora, vc não modela controladores em diagramas de classes, eles sempre aparecem (sempre se a pessoa modelar bem), em Diagramas de Sequência, sempre respondendo uma chamada da GUI, vc pode cria-los e usa-los em várias coisas, mas em geral (110%) dos casos são para GUIs.

Como falei no início, as linguagens vem e vão, algumas permanecem, o C++ está até hoje, e ainda promete, o JAVA (o qual eu não abro mão), se consolidou, o PHP está forte e grande no mercado, o Python chegou prometendo e até agora esta cumprindo(só faltou o switchs nele) e demais linguagens. Todas elas sofrem com o tempo, mas a velha e boa modelagem permanece!

Removendo acentos de maneira simples em PHP

O php tem uma função chamada strtr que é uma mão na roda para resolver problemas de tirar acentos, o único incoveniente é que os caracteres com acentos devem ser pre configurados …

function removeAcentos($string){
$return = strtr ($string, "ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ", "SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy");
return $return;
}

Fácil não ?
Quem deu a “pala” foi o DGmike

Array de Objetos, função para substituir o array_diff

Tem uma coisa em JAVA que eu gosto muito, sao os ArrayList, nada mais é que arrays, porem tem muito mais métodos do que o convencional, o PHP também possui muitos métodos para array, porém o array_diff não funciona bem com array de objetos, e é interessante vc ter um array de objetos… mas enfim para contornar isso criei uma função !

Notem ele pega valores do array de objetos 1 que nao estao no array 2

/**
* $var = o atributo para comparar
*/

 function diff ($var,$array1,$array2){
 $ar_tmp1 = array();//Array temporário para trabalhar com array1
 $ar_tmp2 = array();//Array temporário para trabalhar com array2
 $ar_tmp3 = array();//Array para guardar as keys diferentes
 $ar_return = array();//Array que recoloca os objetos e retorna
 /**
  * Guardando no $ar_tmp1 os valores das keys
  * poderia usar o foreach também, mas uso o for
  * para ficar mais claro as minhas intenções
  */
 for ($i = 0;$i < count($array1);$i++){
  $ar_tmp1&#91;$i&#93; = $array1&#91;$i&#93;->$var;
 }
 /**
  * Guardando no $ar_tmp1 os valores das keys
  */
 for ($i = 0;$i <count ($array2);$i++){
  $ar_tmp2&#91;$i&#93; = $array2&#91;$i&#93;->$var;
 }
 /**
  * A mágica acontence aqui, usamos o array_values para zerar os indices
  * e depois usamos o array_diff que compara as keys, ou seja, valores do $ar_tmp1 que nao
  * estao presente no $ar_tmp2
  */
 $ar_tmp3 = array_values(array_diff($ar_tmp1,$ar_tmp2));
 /**
  * Agora que temos as keys diferentes montamos o array com os objetos
  * referentes as keys
  */
 for ($i = 0;$i < count($ar_tmp3);$i++){
   for ($j = 0; $j < count ($ar_tmp1);$j++){
    if ($array1&#91;$j&#93;->$var == $ar_tmp3[$i]){
     $ar_return[$i] = $array1[$j];
    }
   }
 }
 return $ar_return;
}
/**
 * Para testar
 */
$obj1 = new stdClass();//Classe Standart nativa do PHP
$obj1->id = 1;
$obj1->nome = 'Objeto 1';
$obj2 = new stdClass();
$obj2->id = 2;
$obj2->nome = 'Objeto 2';
$obj3 = new stdClass();
$obj3->id = 3;
$obj3->nome = 'Objeto 3';
$ar1 = array($obj1,$obj2);
$ar2 = array($obj2,$obj3);
print_r(diff('id',$ar1,$ar2));

Para quem gosta de trabalhar com array de objetos, essa seria uma boa função

Converter formato de data do MySQL para o formato BR, em uma linha de código só

O tipo date do MySQL é diferente do tipo de data a qual estamos acostumados, por exemplo o dia de hj no BD ficaria 2008-01-08, o que claramente confunde o usuário, ele pode pensar… “NOOOSSAAA ! Hoje é dia 2008…!” e acabar morrendo de susto 😀 … enfim vamos ao código …

$data_br = implode("/",array_reverse(explode("-",$data_do_bd_mysql)));

//Vou criar a funçao para ficar molezinha para quem quiser ...

function retornaData($data){
return implode("/",array_reverse(explode("-",$data)));
}

Simples não … quero ver agora como faz isso com Python … o Elcio Ferreira talvez ache uma solução …ou meu camarada Tio Mike, ou DGMike