Simplificando o desenvolvimento web/desktop/mobile com YeAPF
Há uma beleza intrínseca e quase objetiva nas coisas mais simples. Todavia, não devemos concluir que uma coisa simplificada é uma coisa simples ou pior, que quem simplificou é simplista.
Simplificar, entendo, é o passo mais nobre da abstração em que uma coisa complexa e abstrata é trazida para o outro em uma forma simples, limpa, acessível, útil. De fato, um programador comum é um simplificador, deve de ser um simplificador. Mas nunca um simplista. Ele deve se aprofundar em pensamentos alheios compreender processos que não lhe são próprios e desenvolver uma ferramenta que ajude na realização daquele trabalho. Nada mais nobre. Programador que é programador deve ser invisível e a mãe dele nunca ser nem lembrada.
Eu não sou programador de aplicativos. Tenho amigos que programam aplicativos e os admiro de coração. O meu foco é programar para programadores, fazer com que a vida deles seja mais simples, bonita, sem ter que eles se andarem enredando com sutilezas sistêmicas que o tirem do foco.
Antecedentes
Há alguns anos o desejo mais profundo de todo programador de aplicativos era usar o mesmo código fonte para compilar seu aplicativo para vários sistemas operacionais. Seriam aplicativos multiplataforma com um único código fonte para dar manutenção e muitos clientes satisfeitos.
Nuances à parte a maior parte do público leigo não entende a natureza de um sistema operacional e as intrincadas interconexões existentes, as exigências que eles fazem sobre o aplicativo e as diversas opções que um e outro oferecem ao programador. Isso sem falar nos custos e tempos de desenvolvimento diferentes. Sem ir mais longe, há pouco tempo um programador me comentou que não entendia porque razão o compilador dele não funcionava em Linux se rodava tão bem no seu Windows… Isso, para mim, só prova a necessidade de carreiras mais curtas para pessoas mais apaixonadas pela profissão.
Toda essa realidade continua viva e gritante para os programadores de sistemas, suporte à vida, compiladores, bancos de dados por citar alguns. Todavia, para o simples e comum programador de aplicativos a vida tem se simplificado grandemente com a massificação do HTML5/javascript. Já é possível escrever código que rode tanto no dispositivo móvel como no computador de mesa.
Propósito
O YeAPF pretende justamente ajudar na construção de aplicativos que sejam de simples manutenção e rodem em maior ou menor medida sobre Desktop e Mobile. Ele fornece uma forma homogeneizada de gerar e gerenciar eventos que podem ser tanto orientados aos dados como à interface de usuários.
Originalmente este esforço se baseava na plataforma cliente-servidor. Hoje, com a disponibilidade de plataformas cada vez menores e mais potentes, observamos que o modelo Desktop (em que interface de usuário, dados e lógica) convivem numa ilha em certa forma tem se transplantado. Porém, com a massificação dos serviços de dados sobre os dispositivos móveis, entendemos que o que faz falta é o modelo misto, em que a interface do usuário está no dispositivo, os dados estão no servidor mas quando possível são cacheados no dispositivo e a lógica, bom, essa esta espalhada: parte na hora da entrada, parte na hora de armazenar e outra parte no próprio banco de dados, disparando eventos para tudo quanto é lado e provocando uma catarata de eventos que pode parecer (ou ser para alguns) bem caótica.
Há algumas coisas que são repetitivas e por isso mais suscetíveis ao erro que acompanha a falta de atenção que temos com as coisas bem conhecidas. Pense na diferença entre a namorada e a esposa que vai entender rapidinho no que estou falando. No terreno desconhecido tendemos a ser mais cuidadosos, cautelosos até. Já quando somos familiares do assunto, engordamos, arrotamos em público e por ai vai.
Estas coisas repetitivas mas necessárias são as que -ao meu ver- precisam de uma base bem conhecidas por todo o time de programação. Pela natureza da programação WEB ela tende a ser caótica e divergente. O próprio Javascript e o PHP nos convidam para esse relaxamento que não nos era permitidos no assembler, C, C++, Pascal…
Foco prático
Não pretendemos de forma alguma inventar a roda nem muito menos torná-la mais redonda. Porém, entre as rodas disponíveis escolhemos uma que nos parece a mais acertada e colocamos uma calota bonita nela.
Nossa roda consiste em um tripé que nos garante a segurança e a chamada ao evento no servidor. Esse tripé é obtido por meio de trés únicas variáveis globais: s, a, e u. O valor para u é obtido na hora do logon e é de responsabilidade inicial do YeAPF se bem o programador pode estender e criar seu próprio gerador de identificador global de sessão. s é o subject (assunto, coisa a ser tratada) e é constituído por uma ou duas palavras das quais se espera que uma delas ao menos seja um substantivo. Finalmente a é a ação, a coisa a ser feita sob o subject e é de se esperar que contenha um verbo. Assim sendo, quando um outro programador continua seu projeto, ele vai entender rapidamente onde estão as coisas. Dê uma olhada na seguinte tabela de eventos para visualmente entender do que se trata:
s | a |
---|---|
alunos | cadastrar |
enturmar | |
pacientes | internar |
listarPorSala | |
darAlta | |
socios | editar |
Uma URL que o programador precise gerar para listar os pacientes seguindo a tabela anterior seria assim:
http://www.hospitalFicticio.com/body.php?s=pacientes&a=listarPorSala
Propositalmente está faltando o parâmetro u para facilitar a leitura, mas qualquer programador que tenha sido informado que a listagem por sala dos pacientes está precisando passar por uma remodelagem, sabe exatamente onde achar o código fonte que a gera no servidor:
<?php ... function fpacientes($a) { switch($a) { ... case 'listarPorSala': $aBody='l_pacientesPorSala'; break; ... } } ...?>
Que por sua vez o vai levar ao arquivo .HTML que é o responsável final pela emissão do relatório.
No princípio eram as macro substituições
Quem já teve a oportunidade de programar em Clipper, sabe como é bom ter uma macro substituição em um relatório por exemplo. Lembro também do tempo em que aqueles que programávamos em linguagem de baixo nível debochávamos dos que programavam em linguagem de alto nível. Bem, a história tem demonstrado que macro substituição não é de todo ruim.
YeAPF favorece a geração de relatórios e formulários de entrada fazendo uso extenso da macro substituição. Isso, ao nosso ver, simplifica o desenvolvimento assim como isenta o programador para o que realmente interessa: engarrafar inteligência na forma de código e distribuir da forma mais rápida e segura.
Por exemplo, o HTML que chamamos no exemplo anterior (l_pacientesPorSala) ficaria assim:
<table> <tr> <th>Setor</th> <th>Sala</th> <th>Paciente</th> </tr> #for("select setor, sala, nomePaciente, nomeMedico from pacientes p, medicos m where p.internado=1 and m.codigoMedico=p.codigoMedico order by setor, sala, nomePaciente") <tr> <td>#(setor)</td> <td>#(sala)</td> <td>#(nomePaciente)<br><small>#(nomeMedico)</small></td> </tr> #next </table>
A macro substituição é obtida usando a simbologia #(). Repare como a partir do exemplo, você consegue ver que os campos são mostrados de forma simples dentro de uma tabela. Veja também que você intuitivamente já reconhece que #for() / #next são macros também. E observe em especial, como o código que gera a tela está separado do PHP que cuida da lógica, do fluxo e das regras de negócios.
O pior de tudo é que este mesmo código pode ser editado usando ferramentas caras como é o DreamWaver mantendo a funcionalidade e sem quebrar a beleza de um editor gráfico da seguinte maneira:
<table> <tr> <th>Setor</th> <th>Sala</th> <th>Paciente</th> </tr> <!-- #for("select setor, sala, nomePaciente, nomeMedico from pacientes p, medicos m where p.internado=1 and m.codigoMedico=p.codigoMedico order by setor, sala, nomePaciente") --> <tr> <td>#(setor)</td> <td>#(sala)</td> <td>#(nomePaciente)<br><small>#(nomeMedico)</small></td> </tr> <!-- #next --> </table>
Sim, comentamos o #for() / #next e sim, a funcionalidade foi mantida. Isso permite que o seu empregador possa alugar os serviços de um web designer para que seu aplicativo fique bonito e você se foque no que realmente você é bom: programar.
Se o código fosse feito como é ensinado em alguns centros de despreparo, sera uma mistureira que funcionaria, claro, mas seria difícil (leia-se demorado, caro) de manter.
YeAPF permite que você se conecte a três bancos diferentes sem alterar uma linha sequer do seu PHP: MySQL, Firebird e Postgresql. Claro, o que for específico de cada banco não tem como, mas veja o seguinte exemplo:
<?php require_once "yeapf.php"; echo "<table>"; $q=db_query("select nome, nascimento from alunos where inscrito='S' order by nome"); while ($d=db_fetch_array($q)) { $nome=$d['nome']; $nascimento=$d['nascimento']; $idade=calcularIdade($nascimento); echo "<tr><td>$nome</td><td>$idade</td></tr>"; } echo "</table>"; ?>
A única coisa que o programador precisa fazer para que o código acima funcione em um ou outro banco é configurar a conexão do aplicativo com o banco. YeAPF se encarrega de utilizar as funções correspondentes ao banco escolhido. Isso, mais uma vez, é menor tempo de produção, e menor tempo é menor custo.
Acompanhe-nos
O caminho que propomos é o que nos leva a uma maior divulgação do conhecimento dentro da sua própria instituição. Em lugar de gastar seus preciosos minutos desenvolvendo e curando as mesmas rotinas de fluxo de dado, lhe oferecemos um produto que permite que toda a tripulação saiba onde procurar o que precisa ser modificado ou onde encaixar mais uma nova funcionalidade em código antigo.
Escrever código novo é fácil e rápido. Difícil é dar manutenção em código antigo. Dizer que documentar código é importante, vital é fácil. Difícil é deixar um código limpo que não provoque medo nos seus colegas nem em você mesmo quando for revisar ele meses ou anos depois.
Mais do que um conjunto de rotinas, acessibilidade coerente a vários bancos de dados sem mudar seu fonte e formas de envelopamento da informação o que YeAPF oferece é um paradigma de programação simples, extensível e acessível à tripulação inteira.