Business Object VS Controller

[quote=$ERVER]Olá ViniGodoy, que bom você por aqui, sempre fui um grande admirador seu!

Então, quanto à persistência, meu ponto de vista é o seguinte: não está na camada de modelo, visto que a persistência é um requisito funcional da aplicação. Porque ela é um requisito funcional? Para chegar a isso, devemos nos perguntar o seguinte: quem necessita da persistência? Resposta: o sistema.
Agora, vamos nos indagar sobre o MVC. Para que utilizar uma arquitetura MVC? Resposta: para separar as responsabilidades. Isso não seria um requisito funcional também? Resposta: não, pois tanto podemos utilizar quanto não utilizar essa arquitetura.
Considerar que a persistência deve estar no modelo, é como colocar a TV em cima da geladeira por falta de espaço na rack: ninguém lhe impede de fazer isso, mas não é o local correto dela.

E o porque disso? Resumindo: MVC trata de separar responsabilidades, não trata das tecnologias envolvidas, como você brilhantemente acabou de nos apontar. Ou seja: um sistema em MVC pode ou não ser persistido. Então, quando o MVC foi idealizado, creio eu que pensaram nisso: se não há garantia que o sistema será persistido, pra que colocaremos algo relacionado a persistência na arquitetura? E não estando na descrição da última, o que se torna? Resposta: requisito funcional - ou infraestrutura, como ACHO que alguns chamam.[/quote]

Exatamente. Era o que eu argumentava. Eu também sou da visão de que persistência não está no modelo. Mas o que quis apontar é justamente isso. Muita gente pensa: mas se não tá no modelo, não deveria estar no controle, ou na view?". E a resposta continua sendo não. A persistência não está no modelo, nem na view e nem no controle, justamente porque ela não está especificada no MVC. O MVC termina no modelo e o que você faz dali para baixo, é problema seu.

JavaBean não impede que pessoas façam escolhas equivocadas, como desenvolvedores optarem por frameworks que exigem a criação indiscriminada de setters, ou empresas contratarem programadores que não sabem o que estão fazendo.

JavaBean é apenas uma convenção pra se definir propriedades em objetos Java, algo comum em linguagens OO. Por exemplo, properties são uma mão na roda em Objective-c, e C# introduziu o conceito de automatic properties a partir da versão 3.0.

+1. Espelhar o banco de dados é o contrário de fazer design OO e costuma resultar em uma arquitetura procedural.

Persistência relacional é um câncer, em termos de OO.

Já viram o quão elegante fica os objetos de um game ou simulador complexo, que quase não persiste nada? Chegam a ser poeticamente bonitos.

[quote]Persistência relacional é um câncer, em termos de OO.

Já viram o quão elegante fica os objetos de um game ou simulador complexo, que quase não persiste nada? Chegam a ser poeticamente bonitos.[/quote]

Infelizmente nunca vi, vou até dar uma pesquisada, me deixou com água na boca!
Outra coisa que anda me deixando curioso são bancos de dados orientados a objeto. Há alguns anos fiz uma pesquisa no google pra ter uma idéia, mas muitos diziam que eles não são performáticos, mas nunca testei.

Ano passado estudei um pouco de Hibernate, e fiquei de cabelo em pé!
Eu sei que pra quem trabalha com produção de software, ele é uma mão na roda, já que deixa muito mais produtivo. Mas tem horas que aquilo vira uma gambiarra que dá medo!

Concordo, e essa é uma das principais dificuldades que tenho com a OO. Manter o estado do objeto sempre consistente, validando antes de setar os valores aos atributos, e o pior: tendo que persistir tudo.

Eu geralmente faço assim: os dados que vem de um formulário, valido no modelo, se for regra de negócio. Por exemplo, um usuário precisa de uma senha de no mínimo 8 caracteres, com pelo menos 2 números, e o login não pode ser deixado vazio.

[code]public class Usuario {

private String login;
private String senha;

public boolean isLoginValido(String login, String senha) {
//aqui verifico se o login não está vazio e se a senha tem ao ao menos 8 caracteres
}

}[/code]

Com isso, em meu controller:

if (usuario.isLoginValido(request.getParameter("login"), request.getParameter("senha"))) { //ai sim verifico no banco se o usuário está cadastrado, já que isso é requisito funcional }

Ando programando desta maneira, o que acham desta abordagem?

acredito $ERVER, pelo outro post que você criou, esteja respondendo de acordo com o Domain Driven Delevopment.

Tenho dúvidas que o DDD seja um padrão único consolidado em arquitetura e que todos os sistemas que não o implemente sejam gambiarras (posso ser convencido com mais informações).

isso é pano para muita discursão:
http://blog.fragmental.com.br/2007/06/22/cuidado-com-domain-driven-design/

a arquitetura Web que aprendi na Faculdade foi o basicao sem frameworks:

GUI(View) => Controller(Servlet´s) => Facade(Design Patterns) => Classes Controladoras(uma para cada entidade contendo Regras de Negócio usando o Modelo e fazendo a comunicação com DAO) => DAO.

Fica algumas Dúvidas:

esta Arquitetura(acima) não é utilizada comercialmente?

É somente uma arquitetura conceitual?(só serve para fins de aprendizado).

Ao estagiar em uma empresa encontrei um Analista que tinha trabalhado em algumas fábricas de software e era um bom programador Java, quando formos desenvolver uma aplicação fiquei ansioso para saber qual a arquitetura iria se utilizada pois ele por ter alguma experiência deve ter conhecido várias e ao discutir o sistema ele falou que a arquitetura seria a mencionada acima(a exceção de ter utilizado o Wicket na View/Controller), fiquei surpreso pois mesmo sendo a que conhecia achava que poderia está obsoleta ou que escolheria outra mais eficaz.

No final a aplicação foi desenvolvida e saiu como esperado.

Aprendi que as Entidades mantém o estado e o comportamento do objeto nada mais e que não deve ter métodos com regras de negócio.

Lógico que a tecnologia evolui tudo pode mudar.

Acredito que aplicação deve ser desenvolvida orientada ao cliente e satisfazer suas necessidades entregando algo de valor ao mesmo conforme desejou e pagou.

Então, Alexsandro Lopes, tudo o que sei sobre DDD até agora é muito pouco, baseado em 2 artigos que li e muita coisa postada por outros usuários aqui. Comprei ontem o livro Domain-Driven Design - Atacando as Complexidades no Coração do Software, de Eric Evans, agora é esperar chegar e ler, pra tirar as conclusões.

Chegou em um ponto muito interessante, mas não se esqueça de que teríamos que entender o porque a arquitetura não é utilizada comercialmente. Lembro-me das aulas que tive em uma empresa - localizada aqui em minha cidade - oferecido em um curso visando contratar estagiários. O curso era de OO e C#. A maneira como passaram a programar em C#, era idêntica aos “modelos anêmicos” descrita pelo Fowler. E se trata de uma grande empresa, que tem contratos com outras grandes empresas do Brasil. Um certo dia no curso, perguntei ao nosso instrutor exatamente sobre isso, porque nos era passada aquela forma de programar, se não era a correta conceitualmente - nós já tínhamos tido aulas de OO na faculdade. Ele nos respondeu simplesmente que é como a maioria sabe programar. e que mudar isso poderia levar muito tempo. Como todos sabemos, se uma empresa desse porte resolve mexer nisso, vai levar muito tempo para que a adaptação seja feita em 100% - mesmo que isso seja feita gradualmente.
Eu não acredito que a forma que todos dizem ser a “comercialmente viável de programar” seja a única. Tanto que desisti de trabalhar em empresas desse porte por conta disso: todos sabem que estão fazendo errado, e continuam a fazer como isso não fosse nada. “Se está funcionando assim, pra que mexer?”

Aí estão outros dois pontos que são muito discutidos hoje em dia.

1 - O papel do analista, o que ele faz, o que teve que estudar na graduação, etc. Mas nem vou entrar nesse mérito porque não acho necessário.
2 - Fábricas de software. Esse é outro ponto crucial. O que prega a OO? O desenvolvimento das aplicações fortemente baseadas no negócio. Então, imagine uma empresa que crie sw para todo tipo de negócio. Não acha isso uma contradição? Deve estar pensando, “ai entra o analista”. Sim, porém, o tempo para essa etapa também é curto, e o negócio que deve ser tratado pelo sw pode não ser bem entendido. Por essas e outras questões, acho que a fábrica de software é hoje em dia obsoleta - eu e mais um punhado de autores de engenharia de sw.

Talvez eu não tenha entendido, mas achei uma contradição ai. Como vou manter 100% o estado do objeto se não aplico as regras de negócio nele? Se eu deixar que alguém o altere externamente, de acordo com alguma condição, não seria uma regra? E essa regra não seria do domínio?

Concordo em partes contigo, pois me parece que geralmente o cliente e pede um programa em linguagem “x”. Pra ele não interessa nada se é OO - a maioria nem sabe o que é isso mesmo. Mas perceba que o que discutimos aqui é diferente. Um sistema pode ser escrito em qualquer linguagem, com quaisquer padrões - e até anti-padrões, como a modelagem anêmica - e terá a mesma aparência pro usuário final. Porém, a diferença entre eles quanto a qualidade e facilidade de manutenção será gritante. A OO foi criada com esse propósito, a qual a diferencia em relação a programação estruturada. Agora, se vamos utilizar modelagem anêmica, a qual, segundo o próprio fowler, se parece com a programação estruturada, qual o ganho que temos com isso?
Dê uma lida neste artigo, quando puder: http://www.agileandart.com/2010/07/16/ddd-introducao-a-domain-driven-design/

Repare que eu também ainda tenho muito mais perguntas do que respostas, principalmente sobre DDD.

Muito obrigado por estar participando, e dando sua opinião. Espero que continue acompanhando o tópico, e expressando suas idéias e dando sugestões.

Abraços!

[quote=ViniGodoy]Persistência relacional é um câncer, em termos de OO.

Já viram o quão elegante fica os objetos de um game ou simulador complexo, que quase não persiste nada? Chegam a ser poeticamente bonitos.[/quote]

Isso mesmo Vini. Em jogos, a responsabilidade de garantir consistência e integridade do domain model está no processo que roda o jogo, o banco tem papel apenas de persistir o estado pra que o “mundo” possa ser restaurado do mesmo lugar que parou quando o processo foi interrompido. Diferente de sistemas corporativos que geralmente são construídos a partir da ideia que essa inteligência reside no processo que roda o banco.

Nem preciso dizer que isso não prejudica apenas nós programadores que lidamos com código, mas também a experiência do usuário que usa o sistema, tanto é que as pessoas amam jogos, na mesma proporção que odeiam sistemas de escritorio. :wink:

[quote]Nem preciso dizer que isso não prejudica apenas nós programadores que lidamos com código, mas também a experiência do usuário que usa o sistema, tanto é que as pessoas amam jogos, na mesma proporção que odeiam sistemas de escritorio.
[/quote]

Carlos, como gamer hardcore sou obrigado a discordar de você. Tem alguns jogos Da Eletronic Arts que hoje em dia, você vê até personagem voando pela tela - e nem super herói ele é! kkkkkkkkkkkkkk

Falando sério agora, vocês tem razão, 99% dos jogos não possuem nenhum tipo de erro, é muito raro. Mas parece que tem algumas empresas - como a EA games - que não ligam muito pra isso também.
Será que esse alto nível alcançado em games tem haver com isso mesmo? Me deixaram curioso, agora.

[quote=$ERVER]
Falando sério agora, vocês tem razão, 99% dos jogos não possuem nenhum tipo de erro, é muito raro. Mas parece que tem algumas empresas - como a EA games - que não ligam muito pra isso também.
Será que esse alto nível alcançado em games tem haver com isso mesmo? Me deixaram curioso, agora.[/quote]

O alto nível é porque se a EA não criar um jogo decente, você vai gastar seu dinheiro com a concorrência. Sistemas corporativos o usuário é obrigado usar qualquer porcaria porque aquele é o trabalho dele.

Então, eu acho que me expressei mal. É que a EA faz trabalho porco, e ainda consegue vender milhões de cópias de seus jogos. Isso me parece acontecer porque, ao ler notícias sobre games e os comentários, se vê muito o que se chama de “fanboys”, aqueles que defendem uma marca com unhas e dentes. O jogo pode ser horrível, ter os piores defeitos, mas se o gamer gosta daquela empresa por qualquer motivo, defende o jogo com unhas e dentes - algo cada vez mais natural hoje em dia, não só com games, mas em vários outros segmentos, também. Essa prática parece ter sido adotada pelas próprias empresas, já que quem sai ganhando são elas - e o pessoal segue como um bando de bois indo para o matadouro.

Voltando ao foco, o que você disse faz todo o sentido: ou o cara usa aquele sistema, ou a empresa encontra outro que o use.

Abraços.

[quote=$ERVER]
Então, eu acho que me expressei mal. É que a EA faz trabalho porco, e ainda consegue vender milhões de cópias de seus jogos. Isso me parece acontecer porque, ao ler notícias sobre games e os comentários, se vê muito o que se chama de “fanboys”, aqueles que defendem uma marca com unhas e dentes. O jogo pode ser horrível, ter os piores defeitos, mas se o gamer gosta daquela empresa por qualquer motivo, defende o jogo com unhas e dentes - algo cada vez mais natural hoje em dia, não só com games, mas em vários outros segmentos, também. Essa prática parece ter sido adotada pelas próprias empresas, já que quem sai ganhando são elas - e o pessoal segue como um bando de bois indo para o matadouro.

Voltando ao foco, o que você disse faz todo o sentido: ou o cara usa aquele sistema, ou a empresa encontra outro que o use.

Abraços.[/quote]

Na nossa área o maior exemplo disso é a própria orientação a objeto. Mesmo sendo comprovadamente uma maneira idiota de se lidar com dados que estão num banco de dados relacional, as pessoas continuam consumindo “produtos” sobre o assunto, como livros, cursos, etc… Até mesmo novas linguagens são veneradas pela sua capacidade de ser compatível com a “maneira OO”, e não pela sua capacidade de oferecer uma solução melhor para o problema de acessar/transformar/filtrar dados (Alô Scala!).

Típica mentalidade de rebanho em ação, igual você disse.

É o que eu sempre digo: já tá na hora de haver uma quebra de paradigma, OO tá chegando a um ponto onde se resolve uma falha e se criam outras 3. Pode-se notar isso pelo gigantesco número de frameworks que estão por aí - e o pior, eles ajudam na produtividade, mas sempre quebram alguns conceitos pra isso.

Eu gosto da OO, e como eu sempre fui meio inclinado a humanas - apesar de ter ido parar em exatas - então gosto muito de debater, perguntar, levantar dúvidas pra chegar a uma solução. OO é o melhor que temos hoje em dia, mas está longe de ser a solução perfeita, como muitos pregam por ai.

Eu também gosto de objetos quando estou criando um jogo, simulação ou mesmo algum tipo de GUI.

Mas quando quero simplesmente lidar com dados (que é do que se trata 99% dos sistemas corporativos) OO está longe de ser recomendado, muito menos é a melhor solução que temos hoje em dia. FP é muito melhor pra isso, IMO.

Eu não posso opinar sobre isso pois ainda sou muito novo na área, mas estou me dando uma chance, vou estudar como um cão sobre essas técnicas e conceitos e ver se realmente alguma delas funciona. DDD me pareceu legal e muito simples, até agora. O mais difícil anda sendo outros conceitos que aborda - repository, quando e como usar services, etc.

Quanto aos “produtos” que você citou, pode até estar certo - já que deve ser experiência própria - mas vou tentar mesmo assim. O máximo que vai acontecer é ter gasto uns R$3.000,00 em livros, A TOA! kkkkkk … Eu sei que deve tá pensando se sou louco ou playboy, mas me encaixo na primeira opção mesmo! Não tendo retorno - não quanto ao dinheiro, mas no conhecimento - mudo de área outra vez! Não gosto de coisas feitas de qualquer forma, cara, se algo não me convence, mesmo com esforço, eu caio fora.

E concordo, pra sistemas que não precisam de persistência a OO funciona que é uma maravilha! Mas ainda tenho um luz no fim do túnel, o jeito agora é estudar!

E quando eu disse

Talvez eu tenha dado opinião sobre algo que não conheço a fundo também, pois comparei apenas com a programação estruturada.

O que seria FP e IMO?

Abraços!

[quote=$ERVER]O que seria FP e IMO?

Abraços![/quote]

FP = Functional Programming (Programação Funcional)
IMO = In My Opinion (Na minha opinião)

:slight_smile:

Acho que você está no caminho certo. Boa sorte na sua empreitada!