Desde que comecei a escrever meu próprio framework venho buscando maneiras mais eficientes de programar. Obviamente, além das minhas próprias idéias, grande parte das minhas inspirações vêm de sistemas já existentes, frameworks que já funcionam muito bem.
Uma coisa que venho notado, é que algumas funcionalidades viraram moda em determinados frameworks, e ninguém tenta criar algo ainda mais eficiente.
O ActiveRecord por exemplo é um padrão de desenvolvimento que ainda é completamente confuso pra mim. Entendo bem de SQL e de programação em PHP, mas o ActiveRecord não é exatamente nem um nem outro, é uma terceira camada de lógica completamente diferente.
Um dos grandes problemas dele é que não funciona bem com bancos que não sigam o padrão determinado pelo padrão. Uma das coisas que boa parte das implementações do ActiveRecord exige é que toda tabela tenha um campo id numérico como chave primária, o que não acontece em 100% dos casos da vida rea.
Em muitos métodos dos objetos do padrão há mistura de coisas da lógica da linguagem com a lógica do banco, uma péssima prática.
De qualquer maneira, minha proposta não é exclusivamente criticar outros padrões, estou tentando criar algo prático. Não sei se existe algo parecido por aí, mas tive essa idéia durante as últimas noites: Acesso ao banco por um objeto único, com índices de array e métodos embutidos. O melhor jeito de explicar é mostrando exemplos:
PHP
$db->foo[0]; //Primeiro resultado da tabela “foo”
$db->cliente[2]->nome; //Campo “nome” do segundo resultado da tabela “cliente”
$db->foo[0]->nome = “Alexandre”; //Define o campo “nome” do primeiro resultado da tabela “foo”
unset($db->foo[0]); //Exclui primeiro resultado da tabela “foo”
$db->cliente = new clienteRecord; //Cria um novo registro na tabela cliente
$db->cliente->nome = 'Alexandre'; //Define o campo nome do novo registro
Como você pode notar, o acesso ao banco é feito como se todas as tabelas estivessem carregadas dentro de arrays. O maior desafio com certeza é fazer com que o sistema efetue as consultas e alterações sem carregar as tabelas inteiras, para não prejudicar a performance. Usarei sobrecarregamento de arrays e sobrecarregamento em objetos pra isso.
Uma das desvantagens óbvias desse sistema é na hora de buscar por algum resultado. Imagine que tenhamos que buscar todos os resultados com nome igual a “Alexandre”, seria algo assim:
PHP
$busca = array();
foreach ($db->foo as $k => $v) {
if ($v['nome'] == ‘Alexandre’) $busca[] = $db->foo[$k];
}
É por esse motivo que existem frameworks que implementam métodos de busca aos objetos, alguns similares a esses:
PHP
$db->foo->findByNome('Alexandre'); //Retorna array com os resultados
Se eu quiser por exemplo aumentar o salário de todos os funcionários da limpeza em 20%, faria algo assim:
PHP
$db->funcionarios->findBySetor('limpeza')->salario *= 1.2;
Essa parte dos métodos de busca e demais funcionalidades eu provavelmente não implementarei. O programador terá que fazer algo assim:
PHP
$db->funcionarios('setor = limpeza')->salario *= 1.2;
E obviamente, pode ser que eu não consiga implementar isso de maneira alguma
Estou encontrando sérios problemas com os métodos de sobrecarga __set no PHP.
Qualquer dica que puderem me dar quanto ao formato e/ou implementação é valiosa.