[RESOLVIDO] - Qual é a melhor forma de comunicar entre camadas?

Boa tarde galera !!!

tenho no meu projeto dois pacotes: ‘View’ no qual tem todas as camadas de visão

(todos os GUI) e ‘Utiiarios’ que coloco os metodos, estou tetando fazer da forma

mais elegante possivel e totalmente POO, a principio não estou preocupando em

fazer em 3 camadas, pois a aplicação em si não é muito grande, o que ficaria

muito trabalhoso e sem sentido. Minha dúvida é qual a melhor forma de utilizar

os componentes do pacote view (Jtextfield, jlabel, entre outros), pensei em duas

formas:
1ª usar no utilitarios um extends pacote view;
2º instanciar um novo objeto da camada view, ex:
DadosGUI dados = new DadosGUI();
dados.jtextfield.setText(“bla, bla, blá”);
OBS: Tentei a 1º opção, porém não consigo setar os valores no jtextfield (não

atualiza);
Qual seria a melhor forma (pensando em POO, e de forma elegante)?? agradeço todos pela ajuda…vlw

Minha sugestão é você tentar usar mvc. Um projeto destktop com basicamente 3 telas que fiz recentemente usei a seguinte arquitetura:

public class FooView extends JFrame { }

public class FooController {
    private FooView view;
    private FooService service;
    
   public FooController() {
	this.view = new FooView();
        getView().setVisible(true); //Pode ser inicializado a tela em qualuer outro local
   }

   private void metodoQualquer(){
        String exemplo = service.executaMetodo();
        getView().getExample.setText(exemplo);
   }

}

Desse jeito sua view fica somente com códigos da montagem da tela em si.
No controller você pode manipular os dados na tela.
No service você pode executar suas regras de negócio. Aí o controle de transação etc fica a seu critério de utilizar algum framework, criar mais uma sub-camada, etc…

Creio que essa não seja a melhor maneira, mas em projetos simples que ja desenvolvi para destktop isso me ajudou e o código ficou bom pra manutenção.

è isso ae!

Sem Dúvida o MVC, não somente para organização desse seu projeto, mas para adequação ao mercado.

No caso de aplicações desktop eu geralmente descarto a camada de controle. Os motivos são simples:

  1. Não existem protocolos complexos entre essas camadas, a troca de dados é feita por chamada de métodos e eventos;
  2. A view é extremamente eficiente na validação de dados, o que ela deixa passar, o model valida;
  3. É impossível para o usuário fazer uma chamada de tela inválida. Não existe uma “url que leva a uma tela” em local nenhum;
  4. Simplifica o código.
  5. Do contrário de aplicações web, é bastante raro você ter uma mesma view para dois controles. E, quando isso acontecer, crie um controle apenas para essa tela (ou um façade, se não quiser chamar de MVC).

Só tome o cuidado para efetivamente separar a camada de model. Para isso, conte com o padrão observer e modele bem suas interfaces.

Um projeto pode ter N camadas, porem se eu fosse você ultilizaria a seguinte estrutura para aprendizagem e organização.

CAMADAS

Apresentação(MVC) no caso do swing se não me engano ele ja implementa MVC

Negocio(aqui seria sua lógica da aplicação “negocio”)

Persistência(aqui seria referente ao acesso ao banco, como JDBC por exemplo, poderia usar o padrão DAO)

MVC se aplica a camada de apresentação

;D

[quote=ViniGodoy]No caso de aplicações desktop eu geralmente descarto a camada de controle. Os motivos são simples:

  1. Não existem protocolos complexos entre essas camadas, a troca de dados é feita por chamada de métodos e eventos;
  2. A view é extremamente eficiente na validação de dados, o que ela deixa passar, o model valida;
  3. É impossível para o usuário fazer uma chamada de tela inválida. Não existe uma “url que leva a uma tela” em local nenhum;
  4. Simplifica o código.
  5. Do contrário de aplicações web, é bastante raro você ter uma mesma view para dois controles. E, quando isso acontecer, crie um controle apenas para essa tela (ou um façade, se não quiser chamar de MVC).

Só tome o cuidado para efetivamente separar a camada de model. Para isso, conte com o padrão observer e modele bem suas interfaces.[/quote]

Em uma tela mais complexa será que realmente o código não fica meio ‘poluido’? Na empresa onde trabalho usamos controller no pdv e não se torna um empencilho.
De qualquer forma, usar uma camada de controle em desktop seria uma questão meio que de ‘gosto’. Não vejo muitos beneficios em utilizar ou não. Você não acha?

Um pouco sim. Mas vale a pena sacrificar toda a arquitetura do sistema por causa de uma tela mais complexa? Além disso, numa tela complexa, vc também tem um controle meio poluido.

Esse talvez fosse o caso de criar um controle ou façade somente para essa tela.

[quote=felipehts]Boa tarde galera !!!

tenho no meu projeto dois pacotes: ‘View’ no qual tem todas as camadas de visão

(todos os GUI) e ‘Utiiarios’ que coloco os metodos, estou tetando fazer da forma

mais elegante possivel e totalmente POO, a principio não estou preocupando em

fazer em 3 camadas, pois a aplicação em si não é muito grande, o que ficaria

muito trabalhoso e sem sentido. Minha dúvida é qual a melhor forma de utilizar

os componentes do pacote view (Jtextfield, jlabel, entre outros), pensei em duas

formas:
1ª usar no utilitarios um extends pacote view;
2º instanciar um novo objeto da camada view, ex:
DadosGUI dados = new DadosGUI();
dados.jtextfield.setText(“bla, bla, blá”);
OBS: Tentei a 1º opção, porém não consigo setar os valores no jtextfield (não

atualiza);
Qual seria a melhor forma (pensando em POO, e de forma elegante)?? agradeço todos pela ajuda…vlw[/quote]

vlw a todos pelas respostas, de fato me ajudou bastante. Acho que no meu caso o melhor seria duas camadas mesmo, a view e a model … =)

só não confunda

M = Model
V = View
C = Controller

com camadas que não tem nada ver

O MVC nem sequer é um modelo de camadas, e sim de responsabilidades. Por isso é um padrão arquitetural, e não de projeto.

Aplicações monolíticas

[color=orange]Nos tempos antigos do reinado do grande porte e do computador pessoal independente um aplicativo era desenvolvido para ser usado em uma única máquina . Geralmente este aplicativo continha todas a funcionalidades em um único módulo gerado por uma grande quantidade de linhas de código e de manutenção nada fácil. A entrada do usuário , verificação , lógica de negócio e acesso a banco de dados estava presente em um mesmo lugar. Podemos definir este tipo de aplicação como aplicação de uma camada ou monolítica , esquematizada a seguir :
[/color]
Aplicações em duas camadas

[color=violet]A necessidade de compartilhar a lógica de acesso a dados entre vários usuários simultâneos fez surgir as aplicações em duas camadas. Nesta estrutura a base de dados foi colocada em uma máquina específica, separada das máquinas que executavam as aplicações. Nesta abordagem temos aplicativos instalados em estações clientes contendo toda a lógica da aplicação (clientes ricos ou gordos). Um grande problema neste modelo é o gerenciamento de versões pois para cada alteração os aplicativos precisam ser atualizados em todas as máquinas clientes.
[/color]
Aplicações em três camadas
[color=blue]
Com o advento da internet houve um movimento para separar a lógica de negócio da interface com o usuário. A idéia é que os usuários da WEB possam acessar sa mesmas aplicações sem ter que instalar estas aplicações em suas máquinas locais. Como a lógica do aplicativo , inicialmente contida no cliente rico não reside mais na máquina do usuário este tipo de cliente passo a ser chamado de cliente pobre ou magro.(thin).

Neste modelo o aplicativo é movido para o Servidor e um navegador Web é usado como um cliente magro. O aplicativo é executado em servidores Web com os quais o navegador Web se comunica e gera o código HTML para ser exibido no cliente.

Neste modelo a lógica de apresentação esta separada em sua própria camada lógica e física.A separação em camadas lógicas torna os sistemas mais flexíveis permitindo que as partes possam ser alteradas de forma independente. As funcionalidades da camada de negócio podem ser divididas em classes e essas classes podem ser agrupadas em pacotes ou componentes reduzindo as dependências entre as classes e pacotes ; podem ser reutilizadas por diferentes partes do aplicativo e até por aplicativos diferentes. O modelo de 3 camadas tornou-se a arquitetura padrão para sistemas corporativos com base na Web.

A modelagem orientada a objetos ajuda a promover a modularidade pois os objetos encapsulam seus dados (propriedades , estados) e oferecem funcionalidades através de seus métodos. Projetando-se de forma adequada os objetos podem ter reduzidas as dependências entre si ficando assim fracamente acoplados e serão mais fáceis de manter e evoluir.
[/color]
O padrão MVC
[color=green]
O modelo de três camadas fisícas ( 3-tier ) divide um aplicativo de modo que a lógica de negócio resida no meio das três camadas físicas. Isto é chamado de camada física intermediária ou camada física de negócios. A maior parte do código escrito reside na camada de apresentação e de negócio.

A arquitetura MVC - (Modelo Visualização Controle) fornece uma maneira de dividir a funcionalidade envolvida na manutenção e apresentação dos dados de uma aplicação. A arquitetura MVC não é nova e foi originalmente desenvolvida para mapear as tarefas tradicionais de entrada , processamento e saída para o modelo de interação com o usuário. Usando o padrão MVC fica fácil mapear esses conceitos no domínio de aplicações Web multicamadas.

Na arquitetura MVC o modelo representa os dados da aplicação e as regras do negócio que governam o acesso e a modificação dos dados. O modelo mantém o estado persistente do negócio e fornece ao controlador a capacidade de acessar as funcionalidades da aplicação encapsuladas pelo próprio modelo.

Um componente de visualização renderiza o conteúdo de uma parte particular do modelo e encaminha para o controlador as ações do usuário; acessa também os dados do modelo via controlador e define como esses dados devem ser apresentados.

Um controlador define o comportamento da aplicação , é ele que interpreta as ações do usuário e as mapeia para chamadas do modelo. Em um cliente de aplicações Web essas ações do usuário poderiam ser cliques de botões ou seleções de menus. As ações realizadas pelo modelo incluem ativar processos de negócio ou alterar o estado do modelo. Com base na ação do usuário e no resultado do processamento do modelo , o controlador seleciona uma visualização a ser exibida como parte da resposta a solicitação do usuário. Há normalmente um controlador para cada conjunto de funcionalidades relacionadas.

A arquitetura de 3 camadas que esta representada abaixo é uma implementação do modelo MVC . O modelo MVC esta preocupado em separar a informação de sua apresentação.

Camada de apresentação ou visualização - Não esta preocupada em como a informação foi obtida ou onde ela foi obtida apenas exibe a informação.

* inclui os elementos de exibição no cliente : HTML , XML , ASP , Applets .
* É a camada de interface com o usuário.
* É usada para receber a entrada de dados e apresentar o resultado

Camada de lógica da Aplicação - É o coração da aplicação . Responsável por tudo que a aplicação vai fazer.

* modela os dados e o comportamento por atrás do processo de negócios
* se preocupa apenas com o armazenamento , manipulação e geração de dados
* É um encapsulamento de dados e de comportamento independente da apresentação.

Camada de Controle - determina o fluxo da apresentação servindo como uma camada intermediária entre a camada de apresentação e a lógica.

* controla e mapeia as ações

Vantagens do modelo MVC :

  1. Como o modelo MVC gerencia múltiplos visualizadores usando o mesmo modelo é fácil manter , testar e atualizar sistemas múltiplos
  2. É muito simples incluir novos clientes apenas incluindo seus visualizadores e controles
  3. Torna a aplicação escalável
  4. É possível ter desenvolvimento em paralelo para o modelo , visualizador e controle pois são independentes.

Desvantangens do modelo MVC:

  1. Requer uma quantidade maior de tempo para analizar e modelar o sistema
  2. Requer pessoal especializado
  3. Não é aconselhável para pequenas aplicações
    [/color]

[color=darkblue] by http://www.macoratti.net/vbn_mvc.htm[/color]

Mvc não é camadas, existe alguns post totalmente errados sobre MVC.

O design pattern Model-View-Controler , mais conhecido como MVC trata de uma solução para design de componentes que atuam dentro de uma mesma camada , normalmente na de Cliente e/ou na de Apresentação. As outras camadas usam outros padrões. A de domínio utiliza ~principalmente os padrões Entity e Service e o de integração os padrões Mediator e Bridge.

O MVC trata da separação de responsabilidade entre as classes da camada e não da separação da responsabilidade entre camadas.

Camadas são referente a divisão do seu software em si. Podemos ter uma aplicação simples de 3 camadas como podemos ter um aplicação de 4,5,6,N camadas, isso varia de projeto para projeto. Por algum abuso de linguagem, desconhecimento ou falta de preocupação em verificar as fontes de informação as pessoas começaram a confundir MVC com separação em camadas. Também deveria ser obvio que enquanto no MVC é necessária a presença das três partes, em separação de camadas não é obrigatória a presença de todas as camadas, apenas as necessárias. Além disso as camadas podem estar distribuídas em vários nodos enquanto que as classes que compõem uma implementação MVC têm que estar “fisicamente” associadas.

À partida seria óbvio supor que estas diferenças são óbvias e fortemente indicativas de que MVC e separação de camadas não são a mesma coisa, mas por alguma razão perdida no tempo muitas pessoas acham que é a mesma coisa. Isto é causado por diversos conteudo da( “internet , pessoas” )que ensina isto de maneira errada.

Aqui no GUJ tem N(s) forum que fala que MVC não é camada.

http://alexmrg.wordpress.com/2006/12/28/what-the-fuck-is-mvc/
http://sergiotaborda.javabuilding.com/2009/11/mvc-e-camadas/
http://publib.boulder.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic=/com.ibm.websphere.ajax.devguide.help/docs/PureAjax_MVC_patterns.html

 ???????????????????  

  Quem insiste em dizer que o padrão MVC é um modelo de camadas ???????


 Acho que já ficou bem explicado a diferença entre camadas e MVC.