Botões, textfields e companhia não são regras de negocio, mas o seu comportamento e disposição são.
A expressão “regras de negocio” é tlv demasiado limitativa. Eu me referia a requesitos.
Os controles não são requisitos em si, mas eles cooperam para atender aos requisitos.
Os requisitos dividem-se em dois grupso: funcionais (RF) e não-funcionais (RNF). Os RNF são de segunrança, arquitetura, ergomia, etc… os controles em si caem nesta area. Os RF são normalmente o que se designa por dominio em DDD mas não é uma relação 1:1.
A ideia que os repositorios contêm logica de negocio porque são responsáveis por escrever pesquisas é simples de entender. As pesquias dependem do modelo: dependem da estrutura fisica do modelo e das estrutura abstracta do modelo ( as regras ). Se existem uma tabela pessoa com uma tabela endereço associada a pesquisa é feita de uma forma, se existe apenas uma tabela, a pesquisas é feita de forma diferente. A mudança de regras de negocio , aka RF , implica na alteração das regras de pesquisas e portanto na alteração do repositorio onde essas pesquisas são criadas. É por isso que o repositorio é um elemento do dominio e não de infra. Elementos de infra não se alteram conforme os RF, apenas com os RNF. Esta diferenciação é importante porque os RNF são o que os frameworks da praça resolvem. Nenhum framework pode resolver RF (embora existam padrões especiais para alguns RF chamados padrões de aplicação). clientes pagam para que RF sejam implementadas. Normalmente eles não enxergam RNF ou os veêm juntos com RF.
O modelo por detrás dos controles depende dos RF. A famosa “o combo X muda comforme o combo Y” é um RF.
“Regra de Negocio” é um termo especial que define RF especiais. São aquelas regras que mudam conforme se muda de cliente. Clientes diferentes têm um nucleo de regras diferentes e um nucleo de regras iguais. Todas são RF, mas a evolução delas é diferente. Regras que mudam conforme a area de atuação do cliente/sistema são Regras de Dominio e aquelas que mudam de cliente para cliente na mesma area são regras de negocio.
Por exemplo , todas os comercios emitem nota fiscal e quase todos trabalham com o conceito de pedido. Isso é uma regra de dominio. No dominio das empresas de serviços à uma ordem de serviço e não um pedido. No dominio de medicina não existe pedidos, nem no de bancos.
Médicos têm historicos dos pacientes. Isso é uma regra de dominio. Como eles têm acesso a esse historico e o que o historico contém é uma regra espcifica do cliente: Regra de Negocio.
Bancos têm clientes e estes têm contas. Isso é uma regra de dominio, mas as informações que eles contêm são regras de negocio.
Regras de Negocio evoluem muito mais depressa que as de dominio (bancos não deixarão de ter contas para clientes tão cedo).
Em DDD não ha uma distinção entre este dois tipos de regras. Existe o Dominio e ponto final. Todos os RF estão no dominio ou são abordados por ele em alguma medida. Tudo o resto é RNF e é resolvido com frameworks e/ou codigo de estrtutura.
A confusão que se sente é que as pessoas confudem “CRUD” com regra de negocio , como se o ato de gravar/alterar depende-se do negocio. Isso é falso. Ele depende na realidade do processo do dominio que necessita de entidades. CRUD é uma forma de alimentar as entidades para o dominio. (Outra seria importação de dados, por exemplo). Fazer um insert não é uma regra de negocio, mas o como se faz o insert para aquele sistema em particular é. Por isso que cada sistema tem os seus inserts e dificilmente (impossivelmente) uma frase SQL usada por um sistema pode ser utilizada por outro. Acho que isso mostra obviamente que o SQL depende e expressa regras de negocio: RF que mudam de cliente para cliente.
CRUD não é uma regra de negocio, mas a implementação dele depende das regras.
Se pensarmos bem, um sistema sempre é algo que se limita a alterar um estado através de um processo. ele pode ter vários processos alterando o estado, mas tem apenas um estado. Para que o altere ele precisa consultar esse estado antes. Isto é o arroz-com-feijão de qualquer software. O estado depende das regras dos processos que são RF. O estado tem que ser preservado porque ele detêm a identidade do sistema. A preservação do estado é decorrente da existencia do proprio estado tal como a preservação da vida é decorrente da própria vida. Preservar o estado, contudo, ainda é uma tarefa em que existem RNF e RF operando simultaneamente. Comunicar com o banco via JDBC é RNF , mas o quê comunicar é RF.
DAO é o cara que se comunica, ele é um RNF e por isso ele pode ser reaproveitado. Ele transfere SQL , mas ele não cria SQL.
Repositorio contém vários RF e por isso ele não pode ser aproveitado e depende de alterações nos RF.
Exactamente por isto que existem 2 padrões e não apenas um. Exactamente por isto um pode ser definido como interface e outro não.
Tudo num sistema está vinculado a requisitos, mas nem tudo está vinculado a regras de negocio ( requisitos funcionais). É isso que diferencia arquitetura e design. Arquitetura preocupa-se apenas com requisitos não-funcionais e design preocupa-se em embutir requisitos funcionais em cima da arquitetura. Todos os frameworks que existem fazem muito, mas fazem apenas RNF. Sempre, em todos eles, existe uma ponta que o utilizador tem que extender para poder incluir RF. O DDD tem apenas a ideia de que os RF devem ser isolados completamente dos RNF de forma que possam ser reaproveitados entre várias arquiteturas. Se isso não pode acontecer, o modelo de dominio ficou “sujo” com regras de infra. Isso é errado em DDD. Aliás é errado em OO e em programação de uma forma geral. Contudo em casos reais nem sempre é possivel fazer isso. Na maiorias das vezes porque o dono do negocio não entende que ter um nucleo de dominio indepenente diminui custos em longo prazo. Ele só vê o aumento a curto prazo já que um modelo de dominio independente é muito ccomplexo de construir e essa complexidade aumenta proporcionalmente à distribuição do sistema. Pior, os desenvolvedores também ainda não entenderam este conceito.
Como saber se um objeto depende de regras de negocio ( requisitos funcionais) ?
Simples, sua implementação mudaria se as regras mudassem ?
Algums exemplos:
String : não depende
List : não depende
Comparator : depende
Entity : depende
Service : depende
RMI : não depende
Serialização : não depende, mas pode depende se necessário.
DAO: não depende. Ele apenas muda se a tecnologia de persistencia mudar.
Repositorio : depende.
Action do Struts : depende.
Servlet de Controle do Struts : não depende.
JTable : não depende
TableModel : depende.
QueryObject : não depende ( embora possa ser implementado para depender)
Specification : depende
Acho que é simples de aceitar que Repositorio contêm regras de negocio. E não depende de como se define regra de negocio já que o estado do sistema que o repositorio pesquisa é o reflexo dessas próprias regras; quaisquer que elas sejam.