Classes de dados e classes de lógica  XML
Índice dos Fóruns » Arquitetura de Sistemas
Autor Mensagem
jprs_one
HelloWorld
[Avatar]

Membro desde: 23/08/2006 12:06:41
Mensagens: 11
Offline

pcalcado wrote:Olá,

Não entendi muito bem o que você propôs. Classes não persistentes seriam as que contêm lógica e as persistente as que contêm dados?


Isso mesmo, é que o olhando o tópico sobre: Classes de dados e classes de lógica

Veio logo em mente, utilizar uma classe que é persistente (acesso direto ao B.D.) ou seja, só faz get e set.
E uma não persistente(está só na memória RAM, não tem acesso direto ao B.D.) que só processa recebe dados do usuário.

exemplo:
classe "Cliente" realiza persistentência em tabela cliente

classe "TransacaoCliente" processa dados enviados por usuário, realiza consulta de dados fazendo uma solicitação a classe Cliente, assim como inserção e etc...

pelo que entendi essa é a idéia do tópico ou não?

Eu estou iniciando em JAVA.
Isso é uma boa prática não é?

abraços

João Paulo
[Email]
pcalcado
Moderador
[Avatar]

Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline

Não, João, na verdade geralmente é uma péssima prática

O tópico discute exatamente isso, sobre a inexistência desta divisão num programa OO. Leia a discussão e siga as referências apra artigos para entender melhor.

Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay
[Email] [WWW] [Yahoo!] [MSN]
jprs_one
HelloWorld
[Avatar]

Membro desde: 23/08/2006 12:06:41
Mensagens: 11
Offline

Ok, valeu pela dica, vou verificar um pouco mais no fórum.
Mais porque não é recomendado???

João Paulo
[Email]
renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

Tirando o tópico da cova outra vez, aqui tá a conversa com o Lozano (ou parte dela, não lembro...)
 Nome do arquivo Dados e lógica.pdf [Disk] Download
 Descrição
 Tamanho 152 Kbytes
 Baixado:  359 vez(es)

peerless
GUJ Master
[Avatar]

Membro desde: 22/01/2007 14:52:26
Mensagens: 1391
Localização: Porto Alegre / RS
Offline

Primeira coisa que ele já peca na resposta é afirmar que em "OO clássico", usar herança é reutilização de código.

FL wrote:
O estilo "clássico" de desenvolvimento OO super-valorisava a colocação de todo o comportamento
de um objeto nele mesmo e o uso de herança como forma de reutilizar código.



follow me
pitacos

"The most problems that teams face are about communication, and all the others are too." - Dan North





[MSN]
pcalcado
Moderador
[Avatar]

Membro desde: 08/03/2004 17:19:35
Mensagens: 5174
Localização: Sydney - Australia
Offline

Não sei se este texto é da época, mas de qualquer forma:

Fernando Lozano wrote:
O estilo "clássico" de desenvolvimento OO super-valorisava a colocação de todo o comportamento
de um objeto nele mesmo e o uso de herança como forma de reutilizar código. Conceituamente, é
muito boa a idéia de um objeto auto-contido, mas na prática as interações entre os objetos e os
vários detalhes relativos a tecnologia (web, gui, persistência, transações, segurança, auditoria, etc),
que não entram em um modelo de objetos de domínio, acabam se imponto


Este ponto mostra alguns problemas. Primeiro eu precisaria de alguma
referência sobre "OO clássica" já que eu nunca vi nenhuma fonte com
credibilidade desvincular estado e comportamento do objeto, mesmo
porque isso não seria mais Orientação a Objetos e sim programação
procedural.

Segundo ponto é que -sendo o artigo de 2005- já existe tecnologia
suficiente para não misturar estes conceitos em Java há muito
tempo. Seria interessante um exemplo do porque isso seria um problema.

Fernando Lozano wrote:
Hoje as técnicas de
programação em camadas e baseadas em componentes trazem muitas idéias e práticas úteis para o
desenvolvedor OO. Note bem, desenvolvimento em camadas e desenvolvimento com
componentes não exigem o uso de OO, ao contrário do que muitos pensam, e evoluíram de forma
relativamente independente das técnicas OO.


Camadas e Componentes são completamente ortogonais a objetos e não
oferecem o que é removido ao não lidar com objetos (i.e. lidar com
estado e comportamento como coisas separadas, Bo e VO). Camadas
oferecem agrupamento por responsabilidade e componente oferece
pedaços de software com contratos bem definidos.

Assim como elas não exigem o uso de OO não trazem os benefícios desta
por si só. Ainda que trouxessem, continua sendo extremamente
ineficiente utilizar uma linguagem OO sem fazer uso do paradigma.

Fernando Lozano wrote:
No lado da modelagem conceitual, procure informações sobre a modelagem de negócios. Neste
campo se torna bem explícito que existem objetos que representam informação e objetos que
representam processos de negócios e fluxos de trabalho.


Além disso não fazer muito sentido para mim (exceto por mal uso de
arquétipos do RUP para objetos) os conceitos de modelagem de negícios
não falam sobre objetos da OO.

Fernando Lozano wrote:
Não que um objeto de dados tenha que
ser reduzido ao BDO dos J2EE Blueprints (e note que um VO é mais do que um BDO, apesar
destes termos serem usados como sinônimos na maioria das vezes), mas ele tem que conter a
funcionalidade que se aplica a ele mesmo, apenas. Ir além disso aumenta o acoplamento e acaba
por dificultar a manutenção a longo praso das aplicações.


Exato e exatamente para não aumentar o acomplamento (além de diversas
outras vantagens) que objetos possuem estado e comportamento em si
mesmo.

Fernando Lozano wrote:
Um erro comum é confundir o processo com a pessoa ou cargo que o desempenha. No mundo real
todas as pessoas e todos os cargos participam de partes diferentes de vários processos, então
qualquer modelo que se limite a coisas como cliente, vendedor e produto estará falho em sua
representação do mundo real. Entretanto é muito mais fácil identificar e modelar estes objetos
"concretos", sobre os quais são armazenadas muitas informações, do que identificar e modelar
processos mais abstratos como um "processo de venda a crédito" ou "processo de venda por
telefone".


Este trecho traz um problema clássico de modelagem: objetos -mesmo
em Domain Model, Domain Driven Design, o que for- não são a
representação do mundo real
. Eles representam uma
abstração e pode ser possível que nesta abstração vendedores
não se tornem clientes.

Além disso, como exatamente não ter estado e comportamento no mesmo
lugar ajudaria?

Fernando Lozano wrote:
Um objeto de negócios, significando um objeto que representa um processo ou fluxo de trabalho,
não representa informação persistente (embora possa ser necessário salvar informações transitórias
sobre o estado do processo no banco de dados), mas sim uma atividade em andamento. Esta
atividade utiliza vários objetos de dados, delegando para eles o que eles sabem fazer sozinhos, mas
coordenando a interação deles com outos objetos.


Isso não faz muito sentido. Em uma determinada modelagem, para um
determinado cenário, isso pode ser verdade mas é apenas um de milhares
de modos de usar objetos.

Fernando Lozano wrote:
Isto reduz bastante o acoplamento entre os
objetos, pois os mesmos objetos de dados podem ser reutilizados por vários objetos de negócios.
Mas se os próprios objetos de dados fazem chamadas a outros objetos de dados, o conjunto todo
fica indivisível, dificultando a reutilização. Por outro lado, mudanças nos processos de negócios
podem ser acomodadas de forma mais pontual, modificando-se o objeto que representa este
processo, e não vários objetos de dados que participam deste processo (a não ser que o novo
processo exija informações diferentes).


Não sei qual o conceito de acoplamento do autor do email mas creio que
ele foge completamente do conceito difundido em engenharia de
software. Utilizando esta estratégia o acoplamento
aumenta:

1) Sempre que você precisar de uma operação vai ter que
levar duas classes, os dados e a lógica, em vez de apenas uma, que é o
objeto.
2) Sempre que a classe de dados alterar a classe de lógica vai ser
alterada (além de acoplamento quebra encapsulamento)

Fernando Lozano wrote:
Já os objetos de dados tem que ser conceituais, complexos. É uma falha muito comum pensar neles
de forma "relacional", quebrando por exemplo uma nota fiscal e seus itens. Pensa-se em objetos
simples, com atributos numéricos ou textuais, quando estes atributos poderiam (e em geral
deveriam) ser outros objetos complexos e coleções de objetos.


Não entendo o que o "relacional" tem a ver com o tópico.

Fernando Lozano wrote:
Olhando para o seu exemplo, por que cliente.comprar tem que chamar vendedor.vende, criando
acoplamento artificial entre as duas classes? Agora, se o cliente compra com cartão de crédito,
quem valida o cartão, é o vendedor ou o cliente? Ou vai criar um objeto "caixa", que fica amarrado
a cliente e a vendedor? Para que o produto seja entregue ao cliente, ele tem que ser retirado do
estoque, qual objeto (vendedor, cliente ou caixa) faz isso? Cria-se também o objeto "amoxarife"?
Observe como o que parece superficialmente cirar um vínculo aceitável, intuitivo entre dois
objetos, acaba mascarando vários vínculos que não são intuitivos e criando várias dependências
não-obvias, que irão dificultar a manutenção. O desenvolvedor que modifica o módulo de cartões
de crédito (ou cheque pré-datado) não espera que ele possa gerar efeitos colaterais no cliente ou no
vendedor. Mas um objeto de negócios controlando o procesos de vendas torna essas dependências
explícitas, então o desenvolvedor sabe que modificar o objeto de cartão de crédito pode afetar o
processo de venda. Ao mesmo tempo, isola os objetos cliente e vendedor
desta mudança.


Este trecho mostra o mesmo problema em confundir mundo real com
abstração falado acima.

Fernando Lozano wrote:
Seguindo adiante, o objeto vendedor será utilizado não apenas na aplicação de frente de loja, que
cuida das vendas. Será utilizado na aplicação de folha de pagamento, que toda no back-end
administrativo e financeiro. Aí o objeto vendedor precisa fornecer informações sobre o seu
percentual de comissões e seu salário fixo, informações que não interessam à frente de loja. O que é
menos pior, onerar o sistema de frente de loja com informações e funcionalidade que só interessam
ao departamento de pessoal, ou onerar o sistema de pessoal com informações que interessam
apenas à frente de loja (e talvez ao contas a pagar e receber) como cartão de crédito? Ou então
esquece-se OO e cada sistema tem sua definição única e incompatível de cada objeto?


Este trecho mostra uma confusão entre conceitos bem interessante. Se
quisermos utilizar um objeto em múltiplos sistemas ele precisa ser de
uma Camada de Domínio (Page-Jones) baixa. No exemplo ele usa um objeto
da Camada de Aplicação (que, por definição, só é utilizada em uma
aplicação) e pega apenas seus dados para passar para outra
aplicação. Você não precisa de objetos burros para isso -e como
objetos burros quebram o encapsulamento estes vão dificultar ainda
mais- basta tornar Vendedor uma abstração numa Camada mais baixa.

Exemplo: Na aplicação de frente de caixa temos o objeto Vendedor. O
objeto Vendedor está associado a um objeto funcionário. O objeto
funcionário está numa Camada abaixo, de negócios, ele não possui
qualquer dependência com a aplicação de venda. A aplicação do RH
define sua própria classe, digamos que seja Beneficiário, que possui
uma associação com o Vendedor. Pronto, classe reutilizada e nenhum
objeto burro necessário.

Nota: Isso é só um exemplo. Se você quer saber porque este tipo
de coisa é tão difícil na prática leia sobre componentes
reutilizáveis.

Fernando Lozano wrote:
Em suma, a visão OO clássica, como se aprende na faculdade, pode funcionar bem quando se
pensa em aplicações isoladas, mas não se mantém tão bem quando se pensa em várias aplicações
dentro de uma mesma organização, e na necessidade de compartilhar informações e código entre
essas aplicações para ganhar produtividade no desenvolvimento das próprias aplicações e
consistência e gerenciabilidade sobre as informações. Por isso há a necessidade de evoluir a visão
OO reconhecendo que nem todos os objetos são iguais entre si e devem ser tratados da mesma
forma. Não que a visão clássica esteja "errada", mas ela é limitada em sua aplicabilidade.


Sabendo que instance-based components não fizeram sucesso esta
afirmação é duvidosa. Como 3 anos mudam muito as coisas espero que a
noção de reusabilidade deste trecho já tenha sido revista pelo autor.

Fernando Lozano wrote:
A classificação dos objetos em objetos de dados e objetos de atividade (processo ou fluxo) é uma
divisão conceitualmente coerente com as práticas OO, porque reconhece o papel de cada objeto
dentro de um sistema maior. O design baseado em responsabilidades é uma prática bem aceita e
antiga no desenvolvimento OO.


Este trecho não faz o menor sentido. Existem papéis para objetos em
sistemas -padrões em Domain Driven Design ou Analysis Patterns são
exemplos destes- mas não há a separação não-proposital
(i.e. Transaction Script/Smart UI...) de dados e lógica, simplesmente
porque sem isso você não tem objetos.

Fernando Lozano wrote:
Este estilo de desnevolvimento é mais fácil de aplicar junto com o desenvolvimento em camadas.
Você mesmo viu a necessidade de seaprar em um mesmo objeto conceitual a funcionalidade
exigida por sistemas diferentes, ou a funcionalidade exigida por camadas diferentes como
persistência e apresentação. E para concilia-la com a idéia dos objetos de dados incorporando toda
a funcionalidade de negócios neles mesmo comecou a criar artifícios como subclasses e interfaces
artificiais, dificultando o entendimento de um sistema e consequentemente sua manutenção.
Chamar de "apectos" piora ainda mais a coisa, pois induz ao uso de programação orientada a
aspectos, que não tem nada a ver com isso. Usar a herança para separar partes do objeto não ajuda
nada, pois a herança sempre soma mais, acopla mais, em vez de separar e isolar.


Isso não faz sentido. Eu não sei exatamente em que ponto do exemplo
ele se apegou mas Camadas são ortogonais a objetos.

Fernando Lozano wrote:
Veja bem, não é melhor ter um objeto de apresentação que recebe um objeto de dados cliente, sem
trazer junto a lógica para compras, cartão de crédito e estoque? Isto não facilitaria no futuro expor
parte do processo como um web service para interfaces com o usuário diferentes, ou separar a
aplicação em um "cliente rico" que roda na máquina do usuário, mas acessa objetos de negócio em
um servidor EJB ou por RMI? Não é mais fácil ter um objeto que se preocupa com a persistência
dos dados de compras de um cliente sem se preocupar se este cliente também pode ter dados de
reclamações ou de consertos pendentes?


Não. Sem receber junto a lógica (i.e. recebendo uma estrutura
de dados ao invés de um objeto) eu preciso fazer com que minha Camada
de Apresentação (que cria e manipula o "objeto de dados" - sic) saiba
demais sobre meu objeto. Da mesma forma eu preciso que minha Camada de
Negócios saiba demais sobre o objeto. Resultado? Quando eu mudar algo
neste objeto eu preciso mudar também quem o cria e todos que o
utilizam. Isso é exatamente o oposto do encapsulamento.

Fernando Lozano wrote:
Não seria melhor explicitar no seu modelo a existência de processos de negócios, em vez de deixa-
los embutidos e "escondidos" dentro das classes de dados? Não seria melhor explicitar no seu
modelo quando uma mesma "pessoa" pode desempenhar vários papeis diferentes (por exemplo o
cliente que compra um produto e o cliente que faz uma reclamação ou aciona a assistência técnica,
ou ainda o cliente que recebe um produto entregue por correio do cliente que paga pelo produto)?


Processos de negócios podem ser objetos. Se o processo é algo
significativo o suficiente (e não apenas um bando de interações) ele
pode facilmente ser representado de diversas formas -Domain-Driven
Design, Services, como exemplo- sem classes burras.

Fernando Lozano wrote:
Sugiro para você e seus colegas a leitura do livro "Projeto Orientado a Objetos" de Meilir Page-
Jones. Ele é cheio de dicas concretas sobre como construir modelos de classes, quando suar herança
e quanto usar agregação, explorando erros comuns como os do seu exemplo. É um livro diferente
dos outros do mercado porque ele, em vez de discutir modelagem de objetos de forma abstrata,
sem nunca criar implementações reais dos sistemas modelados, discute de forma concreta,
apresentando todos os percalços que ocorrem quando o modelo é traduzido para uma aplicação
real. Melhor ainda, ele usa Java para os exemplos de código.


Ótima sugestão! Eu recomendo ao autor a releitura, especialmente na
seção 1.2 Information/Implementation Hiding e provavalmente todo o
capítulo 8. E, na verdade, o livro é bem abstrato, cheio de conceitos
e não traz muitas pistas para implementação das técnicas, mas esta é a
minha opinião.

Fernando Lozano wrote:
Neste livro também é explicado um modelo de camadas genérico, ao qual toda linguagem de
programação, framework, biblitoteca ou aplicação se enquadra. Este modelo parte da aplicação, no
nível mais alto, para o hardware, no nível mais baixo. é muito útil colocar seus objetos dentro deste
modelo, e assim isolar objetos cuja única função é lidar com uma tecnologia específica (como um
DAO para bancos relacionais, ou um cliente para um web service, ou um action do struts) com
objetos cuja função é lidar com uma parte do negócio.


Ops, mais uma confusão a vista. Como eu citei acima, Page-Jones fala
em Camadas de Domínio, que é algo diferente das nossas
arquitetura-de-N-camadas. Mas sim, ele é bastante útil.

Fernando Lozano wrote:
Tanto objetos focados em tecnologia quanto objetos focados em negócio são reutilizáveis, mas de
formas diferentes. Os primeiros em aplicações totalmente não relacionadas, mas que usem a
mesma tecnologia; os segundos em aplicações da mesma área de negócios ou da mesma
organização, mesmo que usando tecnologias diferentes.


Mais ou menos, mas de qualquer forma este trecho confirma a confusão
entre Camadas de Page Jones e Camadas como definidas pelo Fowler em
POEAA e pelo Buschman.

Fernando Lozano wrote:
Minhas sugestões são focadas em sistemas grandes, complexos, integrados, com muitos requisitos
de performance e segurança, coisa que não aparecem em um artigo de revista ou exemplo didático
na faculdade. Coisas que também são frequentemente relegadas nas empresas, que desenvolvem
sistemas de forma muito imediatista, privilegiando objetivos de curto praso e esquecendo que a
maior parte do custo de um sistema são na manutenção, que inclui não apenas mudanças no
negócio em si, como concorrência e leis, mas também na tecnologia, como criar uma interface web
onde não havia, ou criar um web service para acesso externo a um sistema que originalmente era
apenas de uso interno.


E eu imagino de que tipo de faculdade Fowler, Evans, Buschman,
Page-Jones, Yourdon e tantos outros tiraram aquelas técnicazinhas
teóricas...

--

O outro email é um repeteco deste, então vou ficar por aqui.

Phillip Calçado "Shoes"
http://fragmental.tw/
http://blog.fragmental.com.br/
"It is unfortunate that much of what is called 'object-oriented programming today is simply old style programming with fancier constructs." - Alan Kay
[Email] [WWW] [Yahoo!] [MSN]
Rocklee6544
Debugger
[Avatar]

Membro desde: 02/03/2010 03:05:46
Mensagens: 50
Offline

Pelo que eu entendi deveriamos ter os estados e comportamentos todos juntos em um objeto.

Ou seja seria errado simplesmente criar um POJO(objeto com seus atributos e métodos getters e setters).


esse objeto teria toda regra de negócio pertencente a ele.

E para trabalharmos , criariamos classes de serviço.(que tratem de regras especificas)


Bom de qualquer forma, a maneira como trabalho ou pelo menos é que mais vejo é: criar um objeto pojo só para representar a tabela do banco
e usar a model para validar as regras de negócio.
[Email] [MSN]
Rocklee6544
Debugger
[Avatar]

Membro desde: 02/03/2010 03:05:46
Mensagens: 50
Offline

De fato se formos pensar na questão acoplamento , sim o pojo esta fortemente acoplado a classe de negócio

Se mudar o pojo mudarei também a classe de negociol.

Gostaria de saber se o certo então seria criar um classe pojo que valide suas próprias regras de negócio.

E se necessário criar um classe do tipo service que trata aquele objeto de forma específica.
[Email] [MSN]
renatosilva
GUJ Master

Membro desde: 16/12/2004 17:09:19
Mensagens: 1787
Offline

wat
 
Índice dos Fóruns » Arquitetura de Sistemas
Ir para:   
Powered by JForum 2.1.8 © JForum Team