MVP como opção a DBware

Lembro como se fosse ontem, em uma mensagem em private com um conhecido de lista de discussão, ele comentou que estava querendo abandonar DBware e utilizar componentes simples para apresentação de dados. Nem pensei duas vezes, e meu comentário na época ficou algo como “DBware é um framework maduro, implementado há bastante tempo, é como reinventar a roda”. Quem poderia imaginar que o destino me mostraria, na prática, que este colega tinha razão no que estava dizendo.

Meus problemas com DBware começaram quando eu percebi que estava fazendo a mesma coisa diversas vezes, e estava cometendo os mesmos erros nos mesmos lugares. Tudo isto apontava contra a orientação a objetos, uma abordagem que eu já conhecia e com a qual tinha até mesmo alguma experiência.

A abordagem anti-dbware que mais circula internet afora não era suficiente para remover o problema que eu tinha com meus componentes. Ajuda, pois eu poderia remover o problema do Edit/Post/Cancel/CheckBrowseMode imposto por decendentes de tdataset, mas ainda existe a necessidade de configurar cada componente, cada formulário alvo, todo um trabalho moroso e sujeito a erros.

O contato com objetos de negócio (BO), mapeamento objeto relacional (O-R mapping) e persistência de objetos (OPF), diga-se de passagem é assunto para outro post, removeu diversos problemas que eu tinha na construção das regras de negócio dos meus aplicativos, e por tabela fez com que eu enxergasse apresentação de dados de uma forma totalmente diferente.

Durante a busca de mais produtividade com a iteração com o usuário é que eu encontrei o padrão de projeto MVP. O uso desta técnica fez com que formulários complexos fossem configurados em segundos, e totalmente sem erros.

Para utilizar o padrão MVP é necessário utilizar objetos de negócio. No modelo de negócio, cada classe conhece quais outras classes que a compõe, por exemplo, uma classe TPedido sabe que seus objetos apontam para um objeto da classe TCliente, e também para um container com vários objetos da classe TPedidoItem.

Para configurar um formulário através do padrão MVP, tudo o que é necessário é dizer qual atributo do objeto de negócio deve ser ligado a qual componente visual do form. Por exemplo, o atributo Cliente do objeto TPedido será ligado ao componente TClienteComboBox do formulário. Com esta ligação, o framework que controla o sistema saberá o que colocar no combo, o que fazer quando o usuário abre este combo, o que fazer quando o usuário preenche um pedaço do nome do cliente e pressiona, por exemplo, o enter, e qual form deve ser aberto quando o usuário quiser incluir ou alterar os dados de um cliente. E o que foi feito para isto acontecer? Ligar TPedido.Cliente a TPedidoForm.ClienteComboBox, mais nada.

Mas como é possível tanta informação em uma única linha? A resposta é: reaproveitamento. No modelo de negócio, ao construir a classe TPedido você informa que ela tem um atributo Cliente, e que este atributo aponta para a classe TCliente. Com esta informação, o framework sabe que ele deve tratar a tabela que guarda os clientes quando o usuário fizer uma pesquisa no combo.

E o form, como é possível ele conhecer? Todos os forms são registrados no framework, informando que TClienteForm é usado para apresentar objetos TCliente. Então, quando o usuário está em um Combo que apresenta um TCliente, o framework sabe que precisa criar um TClienteForm caso precise apresentar ou alterar tal objeto.

Tudo isto é válido também para Edit, Grid, Bitmap, ou qualquer outro componente que apresente dados de objetos de negócio.

11 thoughts on “MVP como opção a DBware”

  1. Olá João, parabéns pelo Blog!
    Sobre esse assunto gostei mesmo da sua explicação, teria como vc mostrar uma parte de como ficaria isso implementado?

    obrigado

  2. Ola Joao programo a delphi a um bom tempo so da maneira “procedural” e sempre que posso tento aprender sobre boas técnicas de programacao e fiquei muito interessado em programar em oo puro no delphi e venho a tempo tentando “tirar o vicio” do dbware mais surge muitas duvidas e questionamentos e pelo que visto o mpv e um padrão muito interessante para futuros investimentos de estudo assim como outros padroes, se for possível adiciona no msn catataw_mga@hotmail.com para trocarmos idéias e tenho interesse de estar ajudando no press para que os programadores de delphi começam a ter boas praticas de programacao como os de java se vc tiver mais material sobre mvp+mvc+3 camadas com exemplos ficarei agradecido

  3. Olá,

    João, vc poderia criar um demo bem simples explicando o MVP para iniciante? Tipo um projeto para incluir/editar/excluir dados de um TXT, para não ser necessário usar um DB.

    Exemplo:

    Um Form com 2 Edit’s, edtName e edtPassword e os botões para navegar e editar os dados, bem simples, só para iniciar mesmo em MVP.

    Um grande abraço! 🙂

  4. Faz “horas” que estou bolando um tutorial bem didático. Talvez seja no blog, talvez abra uma página no wiki do press, mas de qualquer forma vou deixar o recado aqui.

  5. Olá,

    >Faz “horas” que estou bolando um tutorial bem didático.

    João, faz algo como sugeri em um comentário logo acima, um demo básico, só para o iniciante entender um pouco o MVP enquanto você conclui o tutorial.

    Pelo menos eu queria saber como se trabalha sem o Data-Aware, só com TEdit e etc., e uma coisa muito mais simples que o Press (tem muita coisa), só um Form com dois TEdit e etc., como citei acima.

    Resumindo, um empurrão; eu não sabia o que era SVN, você me falou por alto do TortoiseSVN, e hoje faço downloads de projetos da NET assim como uploads do meu na SF.

    Um grande abraço!
    Silvio Clécio

  6. Silvio,

    MVP ou qualquer outro tipo de apresentação de dados para o usuário é um padrão muito complexo. Não existe receita produtiva sem o auxílio de um framework. Pegar TEdit e estalar os dedos usando apenas VCL simplesmente não existe, então ou você escreve um framework novo ou você utiliza algum que alguém já tenha escrito.

    Para você se aventurar com MVP, ou com qualquer outro meio de apresentação de dados além de data ware: escolha um framework que implemente algum padrão, tente criar alguma coisa, participe de alguma lista aonde você pode tirar suas dúvidas e voi lá, MVP passará a ser realidade para você.

  7. Olá,

    Resumindo: “… Silvio, aprenda a usar o Press ou o Infra, e melhor ainda, se a cabeça aguentar aprenda a usar os dois :)”.

    João, eu vou tentar criar um “micro” framework só para apresentar dados num TEdit; cara, algo do 0 (zero), para ir entendendo aos poucos.

    Pegar um framework grande (Press, Infra e etc.) e já aprender nele é complicado, estou tentando, e haja café 🙂 para aguentar ficar mais algumas horas lendo os códigos e tentar assimilá-los.

    Mesmo assim, valeu a dica 🙂

    Um grande abraço!

  8. Olá Silvio,

    então o que você está procurando não é MVP, mas um meio mais simples de atualizar TEdit. Na minha humilde opinião, aprender um framework completo é bem mais simples do que fazer uma implementação bem simples.

    Quanto aos estudos, você não precisa mergulhar nos fontes. Use as listas, aprenda as interfaces das classes e você irá bem mais longe e bem mais depressa. A medida em que estiver fluente com a interface, vasculhe os fontes para ver como as coisas funcionam. Foi exatamente desta forma que comecei meus próprios frameworks.

Comments are closed.