Dúvida sobre Padrões Arquiteturais - Lógica de Negócios

Boa tarde Senhores!

Onde vocês costumam implementar a lógica de negócios em um aplicativo desktop?

  • Estou tentando definir a Arquitetura Lógica da seguinte forma:
  • Visão:
    .GUI
    .Ouvinte (Tratam os eventos gerados pelos componentes Swing)

  • Modelo:
    .Domínio (Pojo’s)
    .Controle (Trata os pedidos da camada de apresentação)

  • Persistência:
    .IFactoryGateway (A interface IFactoryGateway define os métodos para retornar os Gateway do pacote IGateway)
    .IGateway (definem os métodos para incluir, alterar, excluir e pesquisar)

  • Preciso definir exatamente onde tratar as regras de negócios, mantendo boas práticas para a implementação do projeto.

Obrigado!

Olá… bem vindo. :slight_smile:

Sei que é pouco mas se ler com atenção o link abaixo poderá ajudá-lo bastante.
http://www.javabuilding.com/architecture/introduction.html :idea:

Até onde aprendi, as regras de negócio devem ser implementadas no domínio. Esses POJOs que citou podem realizar coisas úteis do que somente gets/sets, como validações, por exemplo.
Mas, por favor, não confie no que estou dizendo. Aguarde um pessoal com mais experiência poder ajudá-lo.

[quote=ingridfarabulini]Olá… bem vindo. :slight_smile:

Sei que é pouco mas se ler com atenção o link abaixo poderá ajudá-lo bastante.
http://www.javabuilding.com/architecture/introduction.html :idea:

Até onde aprendi, as regras de negócio devem ser implementadas no domínio. Esses POJOs que citou podem realizar coisas úteis do que somente gets/sets, como validações, por exemplo.
Mas, por favor, não confie no que estou dizendo. Aguarde um pessoal com mais experiência poder ajudá-lo. [/quote]

Ingrid,

Obrigado pela atenção! O material foi de grande valia!

Não tenho muita experiencia com aplicações Java Desktop. Tenho trabalhado somento com J2EE. Mas como funciona essa sua camada de persistencia, ou seja o tal pacote IGateway?
Como está organizado seu Modelo de Dominio frente o Modelo Relacional?

[quote=ingridfarabulini]
Até onde aprendi, as regras de negócio devem ser implementadas no domínio. Esses POJOs que citou podem realizar coisas úteis do que somente gets/sets, como validações, por exemplo.[/quote]

Essa questão levantanda pela Ingrid fala a respeito de uma crítica de Martin Fowler a alguns padrões documentados pela Sun em seu J2EE Core Patterns, que ele chama de Modelo de Dominio Anêmico. Ele critica sobretudo os Business Object, definindo-os como uma camada de serviços procedurais sobre um modelo de domínio.

Nela você implementaria lógicas de negócio reutilizáveis. Essa camada é altamentes acoplada a camada de acesso a base de dados (DAO) e ao próprio Modelo de Domínio. São pontos negativos esse alto acoplamento e uma certa violação de principios de Encapsulamento. Fala-se que o modelo torna-se menos expressivo e difícil de entender. Seria uma certa escapadinha do paradigma OO.
A parte positiva é sua alta reusabilidade e a centralização da lógica e do estado do negócio.

Fontes:
http://www.corej2eepatterns.com/Patterns2ndEd/BusinessObject.htm

Já ouviu falar de DDD ? Num modelo estritamente orientado a objetos, a lógica de negócios poderia, muito bem, estar diretamente nos POJOs de domínio (o único problema com isso é que pode dar trabalho para fazer mapeamento objeto-relacional, mas não chega a ser impossível :wink: )

Dê uma olhada no livro “Patterns of Enterprise Application Architecture”, do Martin Fowler, para saber um pouco mais sobre como isso funciona, OK ?

[]´s

[quote=nmoises]Boa tarde Senhores!

Onde vocês costumam implementar a lógica de negócios em um aplicativo desktop?

  • Preciso definir exatamente onde tratar as regras de negócios, mantendo boas práticas para a implementação do projeto.

[/quote]

Leia este topico http://www.guj.com.br/posts/list/206664.java

[quote=asaudate]Já ouviu falar de DDD ? Num modelo estritamente orientado a objetos, a lógica de negócios poderia, muito bem, estar diretamente nos POJOs de domínio (o único problema com isso é que pode dar trabalho para fazer mapeamento objeto-relacional, mas não chega a ser impossível :wink: )

Dê uma olhada no livro “Patterns of Enterprise Application Architecture”, do Martin Fowler, para saber um pouco mais sobre como isso funciona, OK ?

[]´s

[/quote]

Obrigado pela dica! Irei pesquisar sobre o assunto.

Valeu Sergio! As informações me ajudaram muito.

[quote=FrancoC][quote=nmoises]

  • Persistência:
    .IFactoryGateway (A interface IFactoryGateway define os métodos para retornar os Gateway do pacote IGateway)
    .IGateway (definem os métodos para incluir, alterar, excluir e pesquisar)
  • Preciso definir exatamente onde tratar as regras de negócios, mantendo boas práticas para a implementação do projeto.
    [/quote]

Não tenho muita experiencia com aplicações Java Desktop. Tenho trabalhado somento com J2EE. Mas como funciona essa sua camada de persistencia, ou seja o tal pacote IGateway?
Como está organizado seu Modelo de Dominio frente o Modelo Relacional?

Então FrancoC;

Estou utilizando alguns padrões microarquiteturais:

  • Transaction Script;
  • Table Data Gateway;
  • Factory Method;

A camada visão está organizada com a GUI + Ouvinte;

Na camada modelo estou utilizando 2 pacotes:

  • Domínio (POJO’s, classes de validação, operações, etc)
  • Controle (possui dependência com o domínio e IFactoryGateway)

public class ControleUsuario {	
	// pesquisa usuario por login
	public List pesquisarUsuario(String login) throws TesteException{
		IFactoryGateway factoryGateway = new FactoryGateway();
		IGatewayUsuario gatewayUsuario = factoryGateway.getGatewayUsuario();
		return gatewayUsuario.pesquisar(login);	
	}

Na camada persistência tenho:

  • IFactoryGateway: interface que define os métodos para retornar os Gateway do pacote IGateway.
public interface IFactoryGateway {
	
	public IGatewayUsuario getGatewayUsuario();
	
	public IGatewayVendedor getGatewayVendedor();
	
}
  • FactoryGateway: implementa a interface IFactoryGateway;

public class FactoryGateway implements IFactoryGateway{
	
	public IGatewayUsuario getGatewayUsuario(){
		return new GatewayUsuario();
	}
	
	public IGatewayVendedor getGatewayVendedor(){
		return new GatewayVendedor();
	}
	
}
  • IGateway: interfaces definindo os métodos para incluir, alterar, excluir e pesquisar;

public interface IGatewayUsuario {

	public abstract List pesquisar(String login) throws TesteException;
}
  • Gateway: implementa a interface IGateway;
	public List pesquisar (String login) throws TesteException{
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		try{
			con = GerenciadorDeConexao.getConexao();
			stmt = con.prepareStatement(SQL_SELECIONA_USUARIO_POR_LOGIN); 
			stmt.setString(1, login);
			rs = stmt.executeQuery();
			
			List listUsuario = new ArrayList();
			
			while (rs.next()){
				Usuario usuario = criarUsuario(rs);
				listUsuario.add(usuario);
			}
			
			return listUsuario;
  • Esboço da suposta arquitetura:

Se tiver alguma dica, será bem vinda!

Valeu!