[quote]… ou camada de Negócios(Business Object)?[/quote]Estou ficando extremamente contra esse negócio de Camada de Negócio, seu codenome BO, etc.! :x Pq ela certamente provoca mal-entendidos: ela sempre leva todo mundo a pensar q é nela q devemos implementar (“centralizar” ) as Regras de Negócio, quando certo é encapsular Lógica e Regra de Negócio no própria Classe Entidade, enfim dentro dos Objetos DomainModel, né?!; afinal, não foi para isto q o Paradigma de Orientação a Objeto foi inventado (encapsular Dados (em Atributos) e Operações (comportamento em métodos)?!! Esses tais BO’s e VO’s estão começando a me dar calafrios!
[quote=sergiotaborda]Contráriamente ao que muita gente pensa a prática corrente é seguir o modelo do Fowler como indicado na figura enviada pelo Rodrigo e não o DDD.[/quote]Bem, como eu disse em outro tópico: "Claro q não podemos tomar como lei universal (e irrevogável) tudo o q os autores falam: devemos ter senso crítico."
As coisas q não me agradaram muito na imagem (modelo do Fowler) ‘Service Layer’ é: q ela não apresenta um separação clara entre Serviços de Domínio (DomainService’s) e Serviços de Infra (camada conceitual InfraEstrutura). Uhm * ela é muito curiosa: um gráfico meio tipo cebola; ah, a outra coisa q eu não achei muito legal é q ele “dá a entender” (pelo menos para os iniciantes) o q o ‘Domain Model’ deve usar a abordagem ‘Active Record’! :roll:
Enfim: considero que devemos usar o mellhor dos dois mundos!! :mrgreen: (@sergiotaborda, mas na definição de cada Pattern, como vc mesmo ressaltou, o Fowler é muito + preciso|acurado.)[quote=sergiotaborda]Até porque, como dizem os fans do DDD : “DDD não é sobre design patterns”.
[/quote]Agora indo mais off-topic ainda:
[off-topic - ***]
Meu kamarada, realmente é muito mística a tradução da palavra “design” do inglês para o português. E, por vezes ficamos injuriados quando vemos, na tradução de um livro técnico, ela traduzida para “desenhar”; então nós pensamos: q tradutor estúpido, pq ele não traduziu para Projeto|Projetar?! Afinal, p/ o pessoal da Engenharia de Software, Projeto é algo q fica entre a Análise e a Implementação.
Mas, estou começando a perceber q o significado de ‘Desing’ é um pouco mais abstrato, então podemos dizer: como vc faz o design da Análise|Modelagem; e como vc faz o desing da Arquitetura de Software; e como vc faz o design do seu Projeto; e (por que não?) como vc faz o design do seu Código (justo o q, modernamente, chamamos de factoring)?!
IMHO, alguns Patterns do GoF se encaixam mais para Modelagem do q para Projeto propriamente dito.
[/off-topic - ***]
“DDD não é sobre design patterns” -> Por um lado, eu até ampliei esta idéia (transcrito de 1 msg pvt minha):
:arrow: “Francamente, certamente q desenvolver DDD se encaixa perfeitamente em Java. Antes de qq coisa, temos q ter em mente q DDD [color=red]NÃO[/color] tem nada a ver c/ tecnologia; é sobre o código-fonte (de nosso Software) refletir a realidade do (domínio) do negócio dos Stakeholders. E conseguimos fazer isto c/ 1 API fluente (código dos Gerenciadores c/ 1 clareza q pode ser compreendida p/ Business Experts) e com DomainModel com OO [color=red]não anêmica[/color]. E pode ser feito naturalmente em Java.” O próprio M. Fowler disse: “UML is too much, and too little.”(livre tradução: UML é tudo e nada.) Enquanto a UML fornece um ‘Vocabulário’ para um jargão comum, a Ubiquitous Languange complementa c/ ‘Gramática’ e ‘Semântica’. Uma DSL - Domain Specific Language - deve espelhar/retratar fielmente o Domínio dos Stakeholders|Usuários. E a Modelagem é o 1° passo para esta conformidade (a MDD é uma ótima opção). Mas, a UML (mesmo com uma qtd excessiva de diagramas) não é adequada para esta tarefa. Somado a isto as Languagem Workbench (dos dias atuais) estão ainda longe de conseguir traduzir esta “Modelagem” em código-fonte executável. E enquando nós do Java “ainda estamos decidindo” se continuamos ou não c/ a Rigidez Conceitual Burra, os programadores em Ruby on Rails estão correndo por fora sempre se gabando de o Ruby ser uma linguam flexível e p/ isso mais favoravel a DLS! (Perdoem-me por (ter tido q) tacar RoR nesta thread. :oops: ) Então, it’s up to us|cabe a nós (desenvolvedores Java) provar sim q é possível codificar Entity’s (Objetos de DomainModel) totalmente OO (encapsulando suas operações pertinentes) e, por conseguinte, a API de Domain com uma DLS realmente fluente (compreensível até por Analistas de Negócio|Domains Experts, etc.) :XD:
:arrow: Por outro lado, os Patterns (tanto do GoF, como da DDD, P of EAA, etc.) ajudam a assimilar os conceitos e principios do Domain-Driven Design e tb facilitam a sua adoção.
IMHO, não devemos sempre ter tanta rigidez conceitual, até pq nem todos o Sistemas precisam de tantas camadas lógicas, com tanta complexidade (ainda q a DDD não seja bala-de-prata, Ok). Porem, um Design simples o bastante (barely good enough), mas q isole o Domain (do resto da Aplicação) já propicia uma Arquitetura de Software Evolucionária|Emergente. Neste sentido, (assim como o Fowler mostra o ‘Service Layer’ como uma boundary) vejo o Repository (pelo menos numa Micro-Arquitetura inicial) como uma Fronteira, isolando o Domain da Persistência (e isto basta, se o Repositório tem links para algo de Infra: isto não é (tão) importante!). Mas, quando o Sistema crescer, em Tamanho e/ou Complexidade, aí sim justifica a adição de mais camadas (Anti-corrupção, DAO, etc.) e ai sim a Rigidez Conceitual (q deve ser adotada (apenas) neste cenário) se faz jus.
[quote=sergiotaborda]…leia o livro do evans…[/quote]Quem me dera… Sabe como a vida de Desenvolvedor (carregador de piano) começei a ler o DDD Quickly e, pela falta de tempo,… :oops: