Refatoração de Camadas para utilização DTO + CDI e Rich Domain Model

Isso mesmo!

Nem sempre, ela já existe no banco de dados. Você pode ter uma entidade para fins de consulta apenas.
Digamos que a sua aplicação utilize de dados comprados por uma terceira empresa. Esses dados são carregados numa tabela via loader. Os desenvolvedores PL/SQL fizeram uma série de lógica para tratar esses dados e entregar uma view/tabela/view materializada para você. O usuário que a sua aplicação vai usar para se conectar no banco de dados não pode fazer insert, update ou delete nessa tabela, pois ele só possui o grant de select.

Se isso, que você me disse, define uma entidade, a saída lógica seria não ter essa entidade, certo? Prefere fazer os selects e relacionamentos na mão ou usar o Hibernate e ter uma classe que representa essa view/tabela/view materializada?

[quote=pfk66]
No caso das transações, quem executa é responsável por lidar com os casos onde eventualmente a transação falha. Isso geralmente é responsabilidade da camada de aplicação? Não vejo necessidade de projetar minhas entidades para estarem “cientes” disso.[/quote]
Isso é DAO, que é aonde ele estava usando a herança.

[quote=pfk66]
Lembrando que, mesmo quando a transação falha em alguns casos o DBA pode querer saber as entidades que o usuário não autenticado tentou salvar.[/quote]
Quando eu falo usuário, me refiro ao usuário de conexão no banco de dados, não o usuário da aplicação.

@andersonscherrer
Sim, a diferença não é grande. Basta apenas repassar e pronto, já está adotando um padrão de projeto.

Sobre questão do JAR X WebService. Na minha opinião, não faz muita diferença prática.
É uma decisão que vem acompanhada de vários prós e contras. Pode fazer sentido você apenas compartilhar os daos e regras de negócio.

Eu, particularmente, prefiro trabalhar com WebServices. Pois é mais prático para ter aplicações web e mobile.

Percebi agora que está falando de entidades no hibernate, eu estava falando de entidade no domain model.

Certo até aqui foi discutido sobre o DAO, acontece que ainda restam as outras dúvidas do começo do post,

Numa visao TOP-DOWN:

Aplicacao Cliente me envia um JSON com o objetivo de cadastrar uma Pessoa conforme o Model descrito na primeira pagina do post. Conforme:

{nome : “Zé”, enderecos:[{idmunicipio: 10, bairro: “centro”, rua: “Paraná”},{idmunicipio: 10, bairro: “morumbi”, rua: “recife”} ]}

Aqui hoje no controller eu tenho o seguinte:

//aqui eu uso o VRaptor ele deserializa pra mim o JSON
public void gravar(Pessoa pessoa){
      // validar pessoa
      // chamar o DAO ou o Service para gravar
      dao.gravar(pessoa);
}

Em conversa com o @Rafael Guerreiro

Ele sugeriu receber um DTO. Devido a alguns problemas que eu citei pra ele por exemplo controlar os dados que podem ser deserializados pelo JSON
criei algo do tipo

class PersistentPessoa{

public final String nome;
public final List<Endereco> enderecos;

public PersistentPessoa(String nome; List<Endereco> enderecos){
    this.nome = nome;
    this.enderecos = enderecos;
}

Assim eu receberia esse DTO no Controller.
Aqui tenho dúvidas, porque o Endereco também precisa ser um DTO, e outra, como foi sugerido o DTO deveria servir a apenas UMA Action do controller, então preciso ter um “TransientPessoa” que vai ser pra Atualizar pessoa?

Suas duvidas estão em volta do conceito de DDD. Aprenda sobre antes de tomar qualquer decisão…

Eu já li sobre DDD, mas na prática, se não tiver ajuda de quem já mexeu com isso Comercialmente é difícil aplicar.

Eu estou a vários dias pesquisando mas não consegui transformar a Teoria em prática, e pensei que alguém pudesse passar a sua experiência aqui, como acontece na maioria das vezes, inclusive nesse tópico.

Estou em um projeto novo e tenho a oportunidade de melhorar meu código, quero deixar o mais reutilizável, e limpo. E E sei que o povo aqui ajuda muito, além disso quero deixar o post aqui pra quem precise possa vir e consultar.

Talvez eu coloque esse código no github para quem queira usá-lo mas no momento não tenho tempo pra documentar.

DDD é não dificil de aplicar…é uma paradigma novo a aprender…toda essa discussão ai de vcs…ja esta tudo resolvido por la…

Vc vai gastar mais tempo esperando respostas dos outros, discutindo do que aprendendo DDD…
Falo isso por experiência própria…

[quote=FernandoFranzini]DDD é não dificil de aplicar…é uma paradigma novo a aprender…toda essa discussão ai de vcs…ja esta tudo resolvido por la…

Vc vai gastar mais tempo esperando respostas dos outros, discutindo do que aprendendo DDD…
Falo isso por experiência própria…
[/quote]

Pois é, eu consegui dar uma boa melhorada no projeto pesquisando sobre arquiteturas e DDD, com certeza um ou outro vai ter opinião divergente. Mas fica aí o post para quem queira mostrar alguma coisa nova é valido.

Eu já li sobre DDD, mas na prática, se não tiver ajuda de quem já mexeu com isso Comercialmente é difícil aplicar.

Eu estou a vários dias pesquisando mas não consegui transformar a Teoria em prática, e pensei que alguém pudesse passar a sua experiência aqui, como acontece na maioria das vezes, inclusive nesse tópico.

Estou em um projeto novo e tenho a oportunidade de melhorar meu código, quero deixar o mais reutilizável, e limpo. E E sei que o povo aqui ajuda muito, além disso quero deixar o post aqui pra quem precise possa vir e consultar.

Talvez eu coloque esse código no github para quem queira usá-lo mas no momento não tenho tempo pra documentar.[/quote]
DDD à risca é muito complexo, não vale o investimento dessa complexidade técnica enquanto o cliente quer retorno para o Negócio. Parece difícil para muitos fazer o simples. Só o padrão Repository reconheço que é interessante.

[quote]
DDD à risca é muito complexo, não vale o investimento dessa complexidade técnica enquanto o cliente quer retorno para o Negócio. Parece difícil para muitos fazer o simples. Só o padrão Repository reconheço que é interessante.[/quote]

Pois é, é muito conceito teórico, do tipo: Não use herança, Não use o tal do Service, Não use modelo anêmico, SEMPRE use interface, etc… Que são conceitos de certificação, ou de desenvolvimento de frameworks, que não se aplica 100% em prática. Inclusive não encontrei NENHUM exemplo prático de DDD que compreendesse as necessidade de um CRUD que envolvesse duas Tabelas com @ManyToOne. Estou me virando mas pelos que vejo na teoria achei que alguém pudesse mostrar em prática alguma coisa que ajudasse.

[quote=andersonscherrer][quote]
DDD à risca é muito complexo, não vale o investimento dessa complexidade técnica enquanto o cliente quer retorno para o Negócio. Parece difícil para muitos fazer o simples. Só o padrão Repository reconheço que é interessante.[/quote]

Pois é, é muito conceito teórico, do tipo: Não use herança, Não use o tal do Service, Não use modelo anêmico, SEMPRE use interface, etc… Que são conceitos de certificação, ou de desenvolvimento de frameworks, que não se aplica 100% em prática. Inclusive não encontrei NENHUM exemplo prático de DDD que compreendesse as necessidade de um CRUD que envolvesse duas Tabelas com @ManyToOne. Estou me virando mas pelos que vejo na teoria achei que alguém pudesse mostrar em prática alguma coisa que ajudasse.[/quote]
Pois é, essa coisa de “interface para tudo” muitas vezes fica só num processo burocrático para atender a uma doutrina de TI, onde na prática pode nunca existir mais de uma implementação para determinado caso. Se existir a real necessidade, tudo bem. Mas essa coisa de ficar supondo “se talvez no futuro acontecer” não é uma prática ágil, o foco deve ser no horizonte real do cliente.

Não entendi que dúvida você precisa tirar inicialmente. Sobre “@ManyToOne”, isso é relacionado ao ORM Hibernate, onde deverá pesquisar sobre o mesmo, independente de outras coisas.

Sobre projeto como um todo, recentemente postaram aqui um exemplo. Veja se pode tirar algum proveito. Link direto pro src Java: https://github.com/alexlimatds/ifrn-pds-web-revenda-de-veiculos/tree/master/projetoRevendaVeiculosSpringMVC/src

DDD deveria te ajudar a gerenciar a complexidade inerente ao software, e não criar mais complexidade.

[quote=andersonscherrer][quote]
DDD à risca é muito complexo, não vale o investimento dessa complexidade técnica enquanto o cliente quer retorno para o Negócio. Parece difícil para muitos fazer o simples. Só o padrão Repository reconheço que é interessante.[/quote]

Pois é, é muito conceito teórico, do tipo: Não use herança, Não use o tal do Service, Não use modelo anêmico, SEMPRE use interface, etc… Que são conceitos de certificação, ou de desenvolvimento de frameworks, que não se aplica 100% em prática. Inclusive não encontrei NENHUM exemplo prático de DDD que compreendesse as necessidade de um CRUD que envolvesse duas Tabelas com @ManyToOne. Estou me virando mas pelos que vejo na teoria achei que alguém pudesse mostrar em prática alguma coisa que ajudasse.[/quote]

A coisa mais importante que DDD diz é: Não compartilhe o banco de dados entre aplicações; Não use o banco de dados pra armazenar outra coisa senão objetos.

DDD não vai oferecer retorno se você vê o sistema de banco de dados como algo separado e que interage com o sistema OO.

Me desculpem, mas vou ter q dizer…

DDD é uma estratégia…é um caminho…uma diretriz…
DDD não te força a fazer nada…vc tem que decidir com base no seu projeto…
Isso q vc estão falando não é DDD do Erik Vans…

DDD é uma estrategia de arquitetura para ser simples, rápido e fácil…o ser OO…

Infelizmente não tem como discutir DDD dentro de um contexto no forum…seria algo muito demorado…

Mas fica a dica ai…
T+

[quote=FernandoFranzini]Me desculpem, mas vou ter q dizer…

DDD é uma estratégia…é um caminho…uma diretriz…
DDD não te força a fazer nada…vc tem que decidir com base no seu projeto…
Isso q vc estão falando não é DDD do Erik Vans…

DDD é uma estrategia de arquitetura para ser simples, rápido e fácil…o ser OO…

Infelizmente não tem como discutir DDD dentro de um contexto no forum…seria algo muito demorado…

Mas fica a dica ai…
T+[/quote]


Nao acho isso simples, por mais que nao force algo…

Foco no negócio, simplicidade, manutenibilidade, etc, são coisas óbvias para um time entrosado com nível de experiência média plena. Adotar algo para “ser OO…” é pensar mais em TI do que atender o Negocio. Prefiro não adotar soluções para problemas que não existem. Quem geralmente precisa de diretrizes são fábricas de softwares, lugares com alta rotatividade ou equipe pouco experiente, ai sim concordo que o DDD deve fazer sentido.

Se você tem uma aplicação simples não precisa de DDD, usa Smart UI.

Mas até onde sei, DDD e SmartUI podem ser OO do mesmo jeito.

Particularmente, acho que sua dúvida tem muito mais a ver com arquitetura do que com DDD.

Eu recomendaria muito ir para a opção de compartilhar essa api via web service ao invés de jar.

Alguns dos problemas que vejo com jars são:

  • tem que fazer deploy de todos seus clientes quando há uma mudança no core
  • tem que “carregar” configurações do core para seu cliente (endereço do db, urls)
  • aumenta risco de conflito de versões entre aplicativos (quero usar lib A 2.0 no client web, mas meu core só funciona com A 1.0)

Não sei quanto desses problemas seriam reais no seu caso, mas eu prefiro nunca compartilhar jars.

[quote=pfk66][quote=javaflex]
Nao acho isso simples, por mais que nao force algo…

Foco no negócio, simplicidade, manutenibilidade, etc, são coisas óbvias para um time entrosado com nível de experiência média plena. Adotar algo para “ser OO…” é pensar mais em TI do que atender o Negocio. Prefiro não adotar soluções para problemas que não existem. Quem geralmente precisa de diretrizes são fábricas de softwares, lugares com alta rotatividade ou equipe pouco experiente, ai sim concordo que o DDD deve fazer sentido.

[/quote]

Se você tem uma aplicação simples não precisa de DDD, usa Smart UI.[/quote]
Me referi sobre “simples” em relação a arquitetura e não a aplicação a nível de processos de Negócio. Não é porque a aplicação é complexa que precisamos de DDD, nem se a aplicação for simples tem que chegar ao extremo oposto de seguir “Smart UI”, como se fosse 8 ou 80. Mas enfim, cada equipe escolhe o que precisa ou não para atender as demandas no dia a dia.

[quote=AbelBueno]Particularmente, acho que sua dúvida tem muito mais a ver com arquitetura do que com DDD.

Eu recomendaria muito ir para a opção de compartilhar essa api via web service ao invés de jar.

Alguns dos problemas que vejo com jars são:

  • tem que fazer deploy de todos seus clientes quando há uma mudança no core
  • tem que “carregar” configurações do core para seu cliente (endereço do db, urls)
  • aumenta risco de conflito de versões entre aplicativos (quero usar lib A 2.0 no client web, mas meu core só funciona com A 1.0)

Não sei quanto desses problemas seriam reais no seu caso, mas eu prefiro nunca compartilhar jars.

[/quote]

Minha dúvida na verdade era Melhorar o código ou a relação entre as camadas e actions. Por ex. agora estou sem a camada Service, recebo DTO no controller, chamo o DAO/Repository e este por sua vez cria as Entidades através dos DTOs e persiste ou atualiza etc, antes eu tinha o Service no meio do caminho, e também não recebia DTO no controller, recebia direto a Entity.
Sobre compartilhar .jar até agora está indo bem, é meio que “viajem” da minha parte, mas já não estou mais precisando copiar código em cada projeto novo.
E trabalhando direitinho com o maven, estou conseguindo me virar, por enquanto não teve problema de versão de biblioteca.