Leonardo Gaona:
Olá pessoal!
Estou lendo o livro “Patterns of Enterprise Architecture” do Martin Fowler e lá li um pouco sobre o Domain Model. (Inclusive já vou comprar o livro do Evans pra ler depois desse
)
Achei interessante e resolvi abrir esse tópico para discutir com vocês a seguinte questão: Pelo que entendi, ele cita no livro que um dos pontos “chatos” de se usar um Domain Model é a complexidade para mapeá-lo na camada de persistência (problema no qual ele sugere o uso de um “Data Mapper”).
Alguém ai já utilizou Domain Model em algum projeto? Ele se tornou complexo a ponto de ser difícil para mapeá-lo ao banco de dados relacional? E qual estratégia vocês adotaram pra contornar o problema?
Outro ponto, hoje temos tecnologias NoSQL ficando cada vez mais famosas. Combinar um Domain Model com bancos schemaless (MongoDB por exemplo) facilitaria o mapeamento do domínio para a camada de persistência? E pra misturar NoSQL com RDBMS, até que ponto vale utilizar qual tecnologia?
Abraços
Na teoria, abstratamente e apenas olhando a orientação a objetos, o Domain Model é um conjunto de classes que podem definir comportamento e dados. Os dados de um sistema são normalmente relacionados a persistencia ( nem sempre). Portanto, em algum ponto, esses dados têm que ser gravados em algum lugar. O padrão clássico para isso é o Memento. Um objeto memento é um objeto que apenas tem os dados e é usado como “uma imagem” da entidade original. Um memento pode ser um Pojo ou um Map, por exemplo. E o Memento é feito para ser persistido.
Então ha a necessidade de mapear os objetos do Domain model, chamados de entidades, para os seus mementos e depois de volta. É isso que o DataMapper faz.
Isto é OO. Puro e duro. Não estamos envolvendo nenhuma tencologia.
Porque o Domain Model , ele mesmo , não é persistido e existe apenas como abstração na memoria, e o memento é desacoplado desse modelo pelo DataMapper, a persistencia pode ser feita onde vc quiser. Seja SQL ou NoSQL, XML, word, excel, txt, cvs , o que vc quiser. mas toda a persistencia depende de um meta-modelo chamado “modelo de dados”. Se vc usar arquivos cvs, por exemplo, é um arquivo por tipo de memento ou um arquvio para todos os tipos ? Essas coisas têm que ser definidas e controladas em separado do modelo do dominio, pois se vc quiser mudar de cvs para SGBD ou para MongoDB o seu Domain não deve ser modificado ( é isso significa estar desacoplado).
No mundo java , existem restrições no sentido que os frameworks mais conhecidos fazem apenas um tipo de mapeamento e são especilaizados em um tipo de persistencia. O JPA , por exemplo, é especilizado em persistir em SGBD via SQL. O SpringDAta por exemplo, tenta oferecer uma solução para vários, diferentes tipos. Mas todos eles usar anotações em classes para conseguir isso. Tecnicamente, estas classes onde estão as anotações são os mementos e você está definindo como gravar e ler esses mementos com a tecnologia que vc escolheu. Não são um verdadeiro Domain Model pois não são desacoplados.
Na prática isso significa que as pessoas acham que estão fazendo DDD e usando um Domain Model, mas na realidade estão apenas usando mementos e sistemas de gravação/leitura de dados. Se vc mudar o modelo de persistencia (por exemplo trasnforma uma tabela em duas) vc tem que alterar seus mementos para que a estrutrua seja a mesma, não ha desacoplamento. e pior que isso, não ha um Domain Model que permanece inalterado seja qual for a persistencia. Ou seja, na prática ninguém (a grande esmagadora maioria) não usa Domain model nem Data Mapper. Apenas mementos e mapeamentos. E os vendors sabem disso. Eles apenas não lhe dizem. Repare que é ORM (objetc-relacional-mapping) e não DRM ( domain-relacional-mapping). ORM não são Data Mappers no sentido que o Fowler falou pois não ha realmente um Domain Model, ha apenas estruturas de dados.
Estas estrutruas de dados são necessárias e uteis e inevitáveis. E as pessoas só usam elas. Alguns dizem que isto gera um modelo “anémico”. Mas a verdade é que o problema é que não está sendo criado um Domain Model real e está-se confundindo o modelo de dados pelo modelo de dominio. É como confundir um ciclista por um goleiro e dizer que ele está fora de forma porque não sabe defender o gol. Parece lógico, mas se vc pensar bem, é puro nonsense.