Pergunta

Uma mentora eu respeito sugere que um feijão simples é um desperdício de tempo - que os objetos de valor 'deve' conter alguma lógica de negócios para ser útil.

Outra diz que tal código é difícil de manter e que toda a lógica de negócios deve ser exteriorizado.

Eu percebo esta pergunta é subjetiva. Pedir de qualquer maneira -. Querem saber respostas de mais perspectivas

Foi útil?

Solução

Você deve melhor chamá-los transferência Objects ou noreferrer objetos de transferência de dados (DTO) .

No início deste mesmo padrão J2EE foi chamado de 'Valor objeto', mas eles mudaram o nome porque foi confundido com este

http://dddcommunity.org/discussion/messageboardarchive/ValueObjects.html

Para responder à sua pergunta, eu só colocar lógica mínima aos meus DTOs, a lógica que é necessário por razões de exibição.

Ainda melhor, se estamos falando de uma aplicação web banco de dados baseado, gostaria de ir além dos padrões núcleo J2EE e utilização Hibernate ou o Java Persistence API para criar um modelo de domínio que o carregamento suportes preguiçoso de relações e usar isso em vista.

Veja a sessão aberta na vista .

Desta forma, você não tem que programar um conjunto de DTOs e você tem toda a lógica de negócios disponível para usar em seus views / controladores etc.

Outras dicas

A idéia de colocar dados e lógica de negócios juntos é promover o encapsulamento, e para expor tão pouco estado interno quanto possível a outros objetos. Dessa forma, os clientes podem contar com uma interface em vez de uma implementação. Veja a "Diga, não pergunte" princípio e Lei de Demeter . Encapsulamento torna mais fácil de compreender os estados de dados pode ser, mais fácil de ler o código, mais fácil de aulas dissociar e geralmente mais fácil de teste de unidade.

A externalização lógica de negócios (geralmente em classes "gerente" "Serviço" ou) faz perguntas como "onde é usado esses dados?" e "O que estados pode estar?" muito mais difícil de responder. É também uma forma processual de pensar, embrulhado em um objeto. Isso pode levar a um anêmica modelo de domínio .

A externalização comportamento nem sempre é ruim. Por exemplo, um camada de serviço objetos de domínio poder orquestrar, mas sem assumir suas responsabilidades de manipulação do estado. Ou, quando você está na maior parte fazendo lê / grava em um banco de dados que mapear bem às formas de entrada, talvez você não precisa de um modelo de domínio - ou o mapeamento dolorosa objeto / relacional sobrecarga que implica -. Em tudo

transferir objetos muitas vezes servem para separar camadas de arquitetura da outra (ou de um sistema externo), fornecendo as informações de estado mínimo, as chamadas necessidades de camadas, sem expor qualquer lógica de negócios.

Isto pode ser útil, por exemplo, quando se preparando informações para a vista: apenas dar a vista a informação de que precisa, e nada mais, para que ele possa se concentrar em como para exibir as informações, em vez de o informações para mostrar. Por exemplo, o AO pode ser uma agregação de várias fontes de dados.

Uma vantagem é que os seus pontos de vista e seus objetos de domínio são dissociados. Usando seus objetos de domínio em JSPs pode fazer o seu domínio mais difícil refatorar e promove o uso indiscriminado de getters e setters (daí quebrar encapsulamento).

No entanto, há também uma sobrecarga associada a ter um monte de Transferência de objetos e, muitas vezes um monte de duplicação também. Alguns projetos que já estive acabar com TO do que, basicamente, espelhar outros objetos de domínio (que eu considero um anti-padrão).

Depende.

oops, eu acabei de deixar escapar um clichê?

A questão básica para pedir projetar um objeto é: será que a lógica que rege os dados do objeto ser diferente ou o mesmo , quando utilizado / consumido por outros objetos

Se diferentes áreas da chamada de uso para a lógica diferente, externalizar-lo. Se é o mesmo, não importa onde o objeto viaja para, coloque-o junto com a classe.

A minha preferência pessoal é colocar toda a lógica de negócios no próprio modelo de domínio, que está nos "verdadeiros" objetos de domínio. Então, quando os dados de transferência Os objetos são criados, eles são na sua maioria apenas um (imutável) representação estado de objetos de domínio e, portanto, não contêm lógica de negócios. Eles podem conter métodos para clonagem e comparando embora, mas a carne das estadias de código de lógica de negócios nos objetos de domínio.

O que disse Korros.

Valor Objeto:. = Um objeto simples pequeno, como dinheiro ou um intervalo de datas, cuja igualdade não é baseada na identidade

DTO:. = Um objeto que transporta dados entre processos, a fim de reduzir o número de chamadas de método

Estas são as defintions propostas por Martin Fowler e eu gostaria de popularizar-los.

Eu concordo com Panagiotis: a sessão aberta no modo padrão é muito melhor do que usar DTOs. Por outras palavras, eu descobri que uma aplicação é muito mais simples se você o tráfego em seus objetos de domínio (ou algum do mesmo composto) de sua camada de vista todo o caminho.

Dito isso, é difícil de retirar, porque você vai precisar para fazer a sua HttpSession coincidente com a unidade da obra de sua camada de persistência. Então você vai precisar para assegurar que todas as modificações de banco de dados (ou seja, criar, atualizações e exclusões) são intencionais. Em outras palavras, você não quer ser o caso que a camada de visão tem um objeto de domínio, um campo é modificado e a modificação fica persistiu sem o código de aplicação de poupança intencionalmente a mudança. Outro problema que é importante para lidar com é para garantir que seus semântica transacional são satisfatórios. Normalmente buscar e modificando um objeto de domínio terá lugar em um contexto transacional e não é difícil fazer a sua camada ORM exigem uma nova transação. O é um desafio é uma transação aninhada, onde você quer incluir um segundo contexto transacional dentro do primeiro aberto.

Se você não se importa investigando como um não-Java alças API esses problemas, vale a pena olhar para Rails Active Record, que permite que as páginas do servidor Ruby para trabalhar diretamente com o modelo de domínio e atravessar suas associações.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top