Meu modelo MVC esta correto?

21 respostas
P

Pessoal ja faz algum tempo que estou estudando o padrão MVC. Gostaria de Saber de vocês se ele esta correto

Vejam a imagem abaixo das classes Model

Neste diagrama de classe como vcs podem ver possuo a Interface Model, class abstrata AbstractModel e a classe concreta DefaultModel
ModeListener, ModelDispatchableEvent, ModelEvent são usados para gerenciar os eventos da model.

Num controle cadastro simples como é o caso do cadastro de estado basta usar a classe DefaultModel, esta classe mantém um referência a interface DAO. que eu posso instânciar em minha aplicação o DAO e passar como parâmetro do seu contrutor ou no método setDao

Vejam a imagem abaixo das classes controller

Como vocês podem ver na classe Controller - ControllerFrmCadEstados mantém uma referência a interface Model. A classe ControllerFrmCadEstado implementa a interface BaseController que possui os métodos

public interface BaseController{
    void enabledEdit(boolean enabled);

    List fill();
    
    void insert();

    void save();
    
    void edit();
    
    void delete();
    
    void update();

    void cancel();

    void close(); 
    
    void configureEvents();

Onde no construtor da minha View ou seja do meu formulário esta assim

@ViewHandler //Annotation do framework genesis
public class FrmCadEstados extends javax.swing.JInternalFrame {
    
    private BaseController controller; 
    
    /** Creates new form FrmCadEstados */
    public FrmCadEstados(){
        initComponents();        
    }
    
    public FrmCadEstados(BaseController controller){
        enableEvents( AWTEvent.WINDOW_EVENT_MASK );
        try{
            initComponents();            
            this.controller = controller;                                
            SwingBinder binder = new SwingBinder(this, this.controller);//estou o framework genesis para os Actions
            binder.bind();            
        }
        catch( Exception e ) {
            e.printStackTrace();
        }               
    }  
   ........
  .......
}

Agora pergunto será que estruturei bem minha aplicação do Modelo MVC. Esta minha implementação esta correta?
Quem puder me ajudar agradeço desde já

21 Respostas

L

basicamente sua app é em swing imagino… vc tenque por em mente uma coisa em mvc… se vc quiser mudar sua app de swing para a web por exemplo o que vc vai terque alterar? o correto seria apenas terque alterar a sua camada de visão… o mesmo ocorre com o banco na sua model… se ao invez de usar um bd para armazenar as informações vc quissese usar arquivos serializaveis funcionaria certo?

P

Minha aplicação é Swing. Num sei como seria em web o padrão MVC pois não tenho noção nenhuma de aplicação web. Estou utilizando o padrão MVC para aplicações swing como eu vi no livro Padrão de Projeto da serié use a cabeça no livro contém implementações para Swing e para Web. Não como poderia melhor esse meu modelo para aceitar tanto quanto outro. Pelo que tenho visto a controller teria que ser idenpendente. No meu caso esta funcionamente perfeitamente ao mudar minha View do Swing, onde tenho um tela de cadastro, e outra so exibe todos os dados. Acho que MVC para Swing seria esse modelo que fiz. Me corrijam se eu estiver errado.

Agradeço a todos

F

paulofafism,

o que o luistiagos quis dizer (eu acho), é que seu modelo MVC estaria correto se vc pudesse usar tanto swing, como web, como outros clients mudando soh a parte de view, sem mexer na sua camada de controle nem na de modelo.

L

Não existe um modelo de swing e um modelo para web… uma das grandes vantagens de se usar mvc é isolar as camadas de apresentação, controle e negocio… swing e web são somente sua camada de apresentação… um modelo mvc bom é aquele que não é dependente de outra camada… um bom teste seria se depois vc resolvesse colocar seu modelo mvc como web… o correto seria somente alterar a camada de apresentação para isto… tanto o controle como a model não devem ser alteradas para isto…

C

Se você for migrar de Swing para web perceba que a transição não é assim tão simples a ponto de ser necessário apenas escrever a view para a versão web. No Swing, o C (controller) e o V (view) do MVC estão praticamente acoplados. Em uma aplicação web você pode ter as coisas funcionando a partir de actions ou componentes. No caso de actions, que são os seus controllers, seria necessário escrevê-las também. No caso de componentes também seria necessário escrever algumas coisinhas.
De maneira geral, por mais perfeita que seja a implementação do MVC, no caso de alteração da camada de apresentação, alguma coisa de código você vai ter que escrever, além da nova view.

P

Não tão simples assim. Swing é chato para ser “implementável” dentro do MVC, pois ele possui os events (controllers) vinculados a camada de apresentação.

Analizando swing x web.

web ex:

  • view: jsp
  • controller: servlet
  • model: dao, manager, ddd´s

O servlet recebe a requisição, faz as chamadas necessárias ao modelo, e este atualiza a view. (O struts 1 ou 2, implementa muito bem o MVC web)

swing ex:

  • view: jframe, jbutton, awt, swt
  • controller: listeners …
  • model: dao, manager, ddd´s

em comum ? o model …

o que um tem que o outro não tem? Servlet …

então, para transformar uma aplicação web em uma swing ou vice-versa, deve-se alterar duas camadas… e não somente uma do pattern MVC!!!

Foi assim que surgiu o MVP, que na minha opinião é mais aconselhável para app. desktops…

Lembrando que: Se você esta utilizando o Genesis (Framework que serve como controlador mvc para desktop), você apenas seguindo seu funcionamento, consegue algo muito próximo ao MVC da web… a diferença é que para mudar para web, você não precisará alterar duas camadas. Apenas trocar de framework controlador mvc e criar as actions referentes as requisições e dispachers…

T

Olá

Creio que não. Como o cassio falou anteriormente, Modelo e Controle no MVC estão intimamente ligados, e é muito provável que, tendo que reescrever um, será preciso reescrever o outro.

Na verdade, o MVC todo se aplica somente à camada de apresentação. MVC não é separação em camadas lógicas.
Vide http://www.fragmental.com.br/wiki/index.php?title=MVC_e_Camadas

Dao se aplica na camada de persistência. Modelo do MVC != Camada de persistência da aplicação.
Abraços

P

e a camada de persistencia fica dentro de qual letra do mvc então? entendeu?

uma coisa é o padrão mvc a outra são as camadas. Podemos ter uma aplicação dentro do mvc com 4 ou 5 camadas.

L

bem neste caso poderia chamar uma factory de um facade ou delegate dentro de um listener para então invocar a camada de negocios… oq em swing e identico a web? a passagem dos dados… oq e diferente a forma e onde eles são apresentados… ao meu ver ao comparar swing com web um clicar de botão na web é um evento do mesmo modo que em um botão no swing mas no swing é controlado por um listener… não vejo problema em este listener pertencer a camada de visualização… ja que que mesmo na web os eventos estão na camada de apresentação… o que não pode ocorrer é ali ter uma regra de negocio… não sei se estou certo mas acredito que poderia ser feito assim para uma app poder migrar de web pra swing… pelomenos comigo funcionou desta maneira…

T

Aí é que está… A camada de persistência não fica dentro de nenhuma letra do MVC.
As principais camadas (lógicas) de um sistema são: Apresentação, Negócios e Persistência.
O MVC é um padrão (não é separação de camadas) que é implementado dentro da camada de Apresentação.

L

so uma duvida… onde das 3 letrinhas se aplica as facades e os delegates?

L

tnaires:
Na verdade, o MVC todo se aplica somente à camada de apresentação. MVC não é separação em camadas lógicas.
Vide http://www.fragmental.com.br/wiki/index.php?title=MVC_e_Camadas

Não entendi sua afirmação… neste link da wikipedia que vc mandou diz q MVC é a interação das camadas e as camadas são a forma de agrupamento… não sitou em nenhuma parte que mvc aplica somente a camada de apresentação…

P

Pelas minhas pesquisas e estudos sobre MVC e exemplos que vi aplicados a swing e web. Teria sim essa separação de fazer tanto para web quanto para desktop. Por em Swing suponhamos que você tenha que exibir valores em uma View o valor apresentado como um Grafico e na outra View e apresentado com valores números, bem ai que vejo entrando o MVC no swing. Um controller recebendo e enviando requisições das duas Views. Pois bem sem necessidades de alterar o modelo.

As minhas classes Models funcionam idenpendente de ser web ou desktop, mas acredito que a camada controller Web e um pouco diferente da Swing. a controller trataria somente de interfaces swing.

Bem acho quee isso.

T

luistiagos:
tnaires:
Na verdade, o MVC todo se aplica somente à camada de apresentação. MVC não é separação em camadas lógicas.
Vide http://www.fragmental.com.br/wiki/index.php?title=MVC_e_Camadas

Não entendi sua afirmação… neste link da wikipedia que vc mandou diz q MVC é a interação das camadas e as camadas são a forma de agrupamento… não sitou em nenhuma parte que mvc aplica somente a camada de apresentação…


Esse link não é da Wikipedia. É um Wiki mantido pelo pcalcado.

Como falei, as principais camadas lógicas dos sistemas web que conhecemos são: Apresentação, Negócios e Persistência. Em um sistema Web, a Visão e o Controle são implementados na camada de Apresentação, e o Modelo é apenas uma interface para a camada de Negócios (às vezes correspondendo à camada de Negócio em si). Porém, como o texto do link cita, há situações em que o controle é implementado fora da camada de Apresentação, geralmente quando você possui duas visões simultâneas.

Na Mundo Java nº 15, há um artigo também do pcalcado sobre isso.

L

podemos ver que alguns dizem que as coisas são diferentes a do que esta no link citado… dizendo que as actions/servlets fazem parte do controle… o link citado diz outra coisa… eu mesmo aprendi o que se refere no link… mas da pra ver que realmente a uma confusão nos conceitos… mas qual seria a verdade? pra mim e oq esta no link…

T

De fato, não é à toa que se discute tanto MVC neste e nos fóruns afora… Muitos de nós aprendemos um conceito de MVC e o carregamos pro resto de nossa vida de desenvolvedor, estando esses conceitos corretos ou errados.

O que falei acima sobre MVC se baseia no que o pacalcado escreveu, conforme demonstram as referências que passei, e é a que me parece mais correta. Seria bom que os colegas postassem o que conhecem de MVC para discutirmos.

P

Como coloquei no diagrama de classes no inicio deste post e isso que entendo de MVC. Possuo a View, Controller e a Model. a model não pode ter referencia nenhuma da View. Essa referencia pode ser feita através de eventos que a model dispara como e caso das classes ModelEvent e ModelListener. Quando quero noficar a view de mudanças faço isso na controller. na minha classe eu tenho uma referencia a Model, um objeto na qual a instância dessa model e passado como parâmetro do construtor da Controller. e ai a controller faz o resto

P

Bem e isso ai

T

Creio que seja exatamente isso. O problema é quando o MVC se estende a aplicativos WEB: não há uma forma viável de fazer a view “enxergar” um modelo através do padrão Observer. E é aí onde a confusão começa, pois entram conceitos de separação de camadas, etc.

L

não entendi a finalidade de seu modelEvent e modelListener…
events e listeners são responsabilidade da view (não sei se estou correto mais pelomenos ao meu ver é isto…)
o que eles estam fazendo na model?

P

não entendi a finalidade de seu modelEvent e modelListener…
events e listeners são responsabilidade da view (não sei se estou correto mais pelomenos ao meu ver é isto…)
o que eles estam fazendo na model?

Como eu disse o Model e responsavel por notificar a view de qualquer mudança que ocorra na Model, por exemplo
ao salvar um cliente quero que meus JTextFields fiquem desabilitados. então para isso basta implementar a classe ModelListener

private class HandlerModelEvent implements ModelListener{                
        
        public HandlerModelEvent(){
        }
       
        public void notifyChange(ModelEvent e){
            if (e.getID() == ModelEvent.COMMIT){
                if (e.getStatus()){
                   GuiUtil.habilitarJTextField(frm.getPanelDados(), false);
                   frm.getTxtCodigo().setEnabled(true);                        
                }
            }            
            
            if (e.getID() == ModelEvent.INSERT){
                GuiUtil.habilitarJTextField(frm.getPanelDados(), true);
                frm.getTxtNome().setFocusTraversalKeysEnabled(true);
                frm.getTxtNome().setFocusable(true);                
                frm.getTxtNome().transferFocus();
                try{
                    frm.setSelected(true);
                }catch (java.beans.PropertyVetoException ex) {}                
            }
      }
}
Criado 14 de fevereiro de 2008
Ultima resposta 14 de fev. de 2008
Respostas 21
Participantes 6