[quote=rodrigoallemand][quote=sergiotaborda]
Se o modulo A depende de B não ha linearidade.
[/quote]
Linearidade, aqui, seria uma maneira unica para a execução de funcionalidades no sistema, independente do módulo, salvo exceções de especialidades, como gerar uma venda, extornar um faturamento, incluir regras declarativas de pagamento, etc…
Bem explicando melhor… se eu começar a especializar cada entidade que é ‘multi-modulo’, a manutenção e a customização vai ser mais problematica, por experiência própria… Bem, é o que eu acho e o que eu procuro fazer… prefiro perder um pouco em uma arquitetura menos robusta em troca de facilidade de manutenção…
[/quote]
Existem duas frentes para o seu sistema ser extensivel: alterar o processo ; alterar os dados.
No caso de processo (execução de funcionalidade) vc consegue com um serviço . Uma classe bem definida que contenhasas regras padrão e possa ser sobre-escrita pelo cliente. Normalmente isso é feito via script , certo ? No caso o script herdaria a classe para a extender alterando os métodos padrão. Tlv não todos os métodos apenas alguns (cut-points). Outras ideia é utilizar event-driven para que o processo seja na realidade uma sucessão de eventos. alterando o handler do evento, altera-se o processo. (isto é mais ou menos o que se usa em BPM) O handler neste caso seguiria o mesmo padrão de sobre-escrita como se fosse um serviço.
Do lado dos dados existe o conceito de dicioniário de dados. Isto significa básicamente que existem dados pre-definidos no sistema e dados que o cliente pode acrescentar. Mas ambos são definidos da mesma forma: metadados. Isto influencia directamente a forma como se trabalha com os dados. Interfaces podem ser utilizadas para isto com implementações automáticas via proxies. Ou seja, a entidade como um todos tem 200 campos , mas cada interface só lê alguns deles. O sistema pode fazer um select especifico e utilizar um objeto do tipo Map para conter o valores. Esta tecnica funciona, mas as entidades ficam sendo TO apenas.
Quando precisar de novos campos vc edita o dicionário.
O ORM tem que ser controlado dinamicamente pela aplicação. O mecanismo usa o dicionário para definir as tabelas editando os metadados do banco conforme os metadados do dicionário. Ou seja, o sistema cria o banco.
O ORM tem que ser encapsulado para que , caso necessário, possa ser feito manualmente. Ou seja, programado de forma diferente para interagir com bancos que já existem, por exemplo.
A primeira ideia é alterar a propria entidade Pessoa. Isso implica em refazer codigo ou utilizar um dicionário de dados. A alternativa é simplesmente utilizar OO. Herda a classe Pessoa e escreve outra. A utilização de instropeção pode facilitar a re-escrita do dicionário que levaria à rescrita dos metadados do banco. Ou seja, adicione o campo, o sistema faz o resto.
Mas vc não tem um dominio unico. Cada modulo tem o seu dominio. Apenas algums partes desses dominios se sobrepõem. quando eu falo em desconexão me refiro a conexão logica. Seja com rest ou sem existe uma necessidade de conhecer os dados e métodos disponiveis no outro modulo. É esse conhecimento que cria a conexão.
[quote]
è justamente ai que vem o pulo-do-gato… Fazer a aplicação monobloco é facil… ganhar na customização que é o dificil… minha ideia é tentar fazer essa customização menos traumática… [/quote]
hum… é complicado isso… o ideal e´vc ter um bom modelo OO da sua aplicação onde as peças importantes sejam amoviveis. Desta forma quando uma tiver que ser alterada ela possa ser. Não tem como vislumbrar todas as alternativas de customização à priori, então a solução é não o fazer. Assumir que tudo pode ser alterado e prover mecanismo para o fazer. Em OO isso é simplificado. Vc so precisa substuir implementações. Dai a necessidade do padrão Façade ( ou se quiser Interface+Implementação). O seu sistema é a orquestação de interfaces. A customização é alteração da implementação base dessas interfaces.
Parece-me que o seu problema é na definição de uma estrutura de dados que seja utilizável por todos os modulos. e mais que isso, permitir que essa estrutura aumente em quantidade de campos e relações.
Isso tem um custo. O seu sistema tem que ser mais abstracto que o normal e tem que forçar regras abstractas.
Mas parece-me que esse custo vc não quer pagar… ainda não descobri como resolver esse problema sem utilizar algum tipo de mecanismo “esoterico” ou abdicar de alguma coisa (por exemplo, abdicar de entidades ricas em deterimento de TO)…