Acorda pra Web!

Tecnologia que vai mudar nossas vidas, depois do café.

Persistência de objetos

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.

4 Respostas para “Persistência de objetos”

  1. Aguinelo Pedroso diz:

    Cara muito interessante essa sua iniciativa, eu também não entendo muito desse activeRecord e acho interessante prezar pela simplicidade e leveza, vou estudar esse seu problema e se me ocorrer alguma idéia interessante eu te mando um e-mail.

    Abraço

  2. Michael diz:

    Interessante…
    como eu disse (ou não) num dos seus posts anteriores, tambem estou implementando uma classe SQL, mas ela não é tão complexa quanto a sua…
    Criei um método pra ela chamado procura ($tabela,$campos,$busca);
    onde eu posso enviar na busca ou um id (numérico) ou uma expressão (string).
    Então eu posso simplesmente fazer o seguinte:
    $result=$db->p (’funcionarios’,'*’,5) // Se eu quiser só o quinto funncionario
    $result=$db->p (’funcionarios’,'*’,'name LIKE “Alex%”‘) // Se eu quiser procurar todos os funcionários que comecem com Alex
    Pra depois fazer o while…
    while ($obj=$db->fetchObject($result)) {
    $db->update (’funcionarios’,array (’salario’=>$obj*1.2),$obj->id);
    }

    São algumas linhas a mais, mas resolve o problema… acho que vou implementar algo parecido em minha classe pra estes casos (gostei… ) ;)

  3. Maurício M. Maia diz:

    Tenho me dado muito bem com o ActiveRecord no Rails. É um dos motivos para estar desenvolvendo todos novos projetos em RoR. Acho que você também pode se interessar em dar uma olhada no ActiveRDF e no ActiveResource…

    Mas parabéns pela sua iniciativa, é muito bom pirar nas nossas próprias idéias!

    Abraços!

  4. wennys diz:

    Amigos, me adicionem no msn. Poderíamos trocar umas idéias sobre frameworks. Assim como vcs, sou intrigado com a forma como alguns frameworks consagrados trabalham.
    Há algum tempo comecei o meu proprio framework e gostaria de compartilhar essa experiência e aprender mais com vcs.
    Um abraço a todos.
    Meu msn é : wennyscarlos@hotmail.com

Deixar um Comentário

XHTML: Você pode usar essas tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>