2007-10-09 04:59:38
tags: 

O Zen e a arte cavalheiresca da programação orientada a objeto (Parte 18)

Para ver os artigos anteriores desta série, clique aqui.

Olá Pessoal, estamos de volta com a série que mostra alguns princípios de programação orientada a objetos precisamente a cada rand (1,32768) dias!

Muito bem, senhoras e senhores. Acho que chegou a hora da gente "objetivar" um pouco e listar aqui nossas classes e seus métodos: até eu, depois de algum tempo sem escrever, me perdi! Já falamos livremente sobre os modelos, controllers e views de nosso quase-framework; agora é importante colocar no papel. Digo, no banco de dados. Enfim, vocês entenderam.

Então vamos começar com a classe Model, base para todos os nossos modelos:

Classe Model

Atributos 

$primarykey

String. Nome da chave primária do banco de dados. O default é id, mas pode ser qualquer nome desde que seja inicializado ao criar o modelo.

$table

String. Nome da tabela à qual o modelo será mapeado. O default é o nome do modelo.

$data

Array. O array $data vai conter os dados do modelo, mapeando cada campo com seu valor.

$fields

Array. Lista dos campos da tabela relacionada ao modelo, associado ao tipo e tamanho de cada campo. O default é obtido diretamente do banco de dados.

$validationstatus

Array. O array $validationstatus contém a situação de validação de cada campo do modelo. O método Validate() popula este array com a situação de cada um dos campos, (true/false) de acordo com as regras de validação de cada um.

 

Métodos

LoadById($id)

Carrega os dados do registro cuja chave primária é $id no array $data do modelo.

Save()

Salva os dados do modelo no banco. Antes executa a função ValidateFields() para garantir que os dados são válidos. Se a chave primária no modelo estiver vazia, ele cria um novo registro. Se estiver preenchida, ele atualiza os dados do registro que contém este id.

DeleteById($id)

Remove da tabela o registro com o id $id. Bem simples. O único perigo aqui é se a gente não configurar corretamente a tabela para lidar com o efeito cascata, ou seja, se a gente deixar alguém apagar um registro que é referenciado por outros registros. Por exemplo, se eu apago um post que tem vários comentários relacionados, precisamos remover todos eles, certo? A boa notícia, pra quem ainda não sabe, é que o banco cuida disso sozinho pra nós.

ValidateFields()

Valida cada um dos campos de acordo com suas regras de validação. Como a classe Model é uma classe genérica, ou melhor dizendo, abstrata, vamos fazer aqui uma validação também genérica, de acordo com as características dos campos da tabela. Assim, vamos validar, por exemplo, se um determinado campo é texto, e se seu tamanho está dentro do tamanho estipulado na descrição da tabela. Para validações mais específicas, vamos reescrever a função ValidateFields() em cada um dos nossos modelos.

Reparem, caros leitores, que nosso objetivo aqui é clareza e simplicidade. Poderiamos ter chamado a função LoadById simplesmente de Load; Mas a idéia é deixar o uso da função realmente claro; Percebam que já na função Save isso já não é necessário pois vamos salvar o estado do modelo no banco, sem a necessidade de nenhum campo específico estar definido. Para salvar um novo registro vamos simplesmente salvar um modelo que tenha sua variável $id vazia.

Uma diferença bastante grande desta proposta em relação ao Cake é a divisão de trabalho: como o Cake usa o pattern ActiveRecord, tem muita coisa dentro da classe Model. Aqui nós estamos dividindo este trabalho com a classe ModelCollection, que irá fazer todo o trabalho de banco de dados quando estivermos lidando com grupos de registros, ou coleções.

That's all, Folks! Mandem seus comentários, dúvidas e xingamentos e até a próxima!

 

18 Comentários:

[Elomar]  Parabéns pelos textos, e não demore tanto com o próximo!  [REPLY]

[danilo]  Valeu Elomar! Grande Abraço!   [REPLY]

[ms*]  Ainda bem que escreveu! Achei que ia perder completamente o moral com a comunidade :-) beijinho, lindo.  [REPLY]

[danilo]  Não posso resistir a um pedido desses... você vai ser canonizada pela comunidade digitalminds, dona ms*! beijo, minha linda.

[LuRsT]  Está a ficar um espectáculo essa série! Quero ver como vamos juntar as classes todas e meter o MVC para melhorar a programação na prática!  [REPLY]

[danilo]  Valeu LuRsT!!! A gente chega lá, agora tá quase!  [REPLY]

[Emiliano ESB]  Coisa fina, hein?  [REPLY]

[danilo]  Valeu Emiliano! Grande abraço!  [REPLY]

[LuRsT]  Ae danilo surgiu uma duvida. Quer dizer que nos usando essa classe model tão dinamica tendo ela feita e pronta, nao so podemos usar no projecto que estamos fazendo como em todos os outros estou certo? A classe model se for bem feita pode ser usada para qualquer coisa?  [REPLY]

[danilo]  Exatamente, meu caro Lurst! Mais que isso: poderemos estendê-la e usá-la para quaisquer dados que quisermos!  [REPLY]

[LuRsT]  Maravilhoso, dai o nome voçê chamar de quase-framework. Eu ainda nao estou entendendo como é que a gente pega num array de qualquer tipo de dados e transforma em algo legivel. Voçê recomenda algum site ou livre que fale sobre MVC assim tão bem como voçê? Abraço  [REPLY]

[Rodrigo Aramburu]  Cara como fica no caso de um objetos contiver um array de objetos como faria para gravar e ler este array em uma tabela separada?  [LINK]  [REPLY]

[danilo]  Olá Rodrigo! Esse caso é chamado de relação "has many" ou "contém itens". A gente chega lá se tiver tempo, mas pra agilizar vc vai precisar saber quais itens um modelo pode conter e fazer automaticamente as operações nesses modelos... Relacionamentos são uma coisa chata de se fazer com objetos, mas tudo já foi resolvido por aí hehehe... abraço!  [REPLY]

[Junio]  Danilo Medeiros, como será a visibilidade, public, protected e private das classes e atributos?  [REPLY]

[danilo]  Oi Junio, na teoria, atributos devem ser sempre privados, e seus valores devem ser acessados/alterados sempre por métodos. Abraço grande!  [REPLY]

[Junio]  Muito obrigado Danilo,sua explicação foi simples e muito valiosa para meu entendimento.Paz e saúde para ti!  [REPLY]

[Guilherme Ventura]  Olá, Acompanho toda a série e queria agradecer, após ler 50 apostilas ensinando orientação a objetos, eu finalmente entendi em 3 Posts ,rs. eu acompanhei a série do MVC, mais me surgiu uma dúvida aparentemente banal : Por onde eu devo começar pra exibir os dados? por exemplo. numa pagina qualquer, qual classe eu devo referenciar para que tudo comece? A view, o controller ou o model ?  [REPLY]

[ivan]  cara, poarabéns vc escreve muito bem. espero que continue a escrever sobre diversos outros assuntos  [REPLY]