5
respostas

Desacoplar GUI de Controller

Olá.

Considere:

  • um objeto Visao - GUI (Interface Gráfica com o Usuário);
  • um objeto Controlador, que trata eventos de sistema, ações da GUI e
  • objetos modelo

Considere que um objeto Visao recebe um objeto Controlador como parâmetro:

 Controlador controlador = new Controlador(repositorio);

 Visao visao = new Visao(controlador);

Considere também, que o papel do Controlador é repassar eventos de sistema para os objetos do Modelo, ou seja, uma ação X na GUI deverá ser repassada ao Controlador que por sua vez repassará ao Modelo.

Uma forma de desacoplar uma Visao de um Controlador, seria extrair uma interface comum para que uma Visao a implemente, pois o objetivo é trocar/subsituir uma Visao por outra.

Pergunta: Seria muita paranóia criar uma interface para que ambas, Visao e Controle a implemente?

Veja:

public interface VisaoInterface {
    void entrarAlgo(Integer algo);
}

public class Janela extends JFrame implements VisaoInterface{
//    private Controller controller; 
// ou a própria interface
private VisaoInterface controller;


    @Override
    public void entrarAlgo(Integer algo) {
        this.controller.entrarAlgo(algo);
    }
        // objetos GUI
    private void ButtonEntrarAlgoActionPerformed(ActionEvent evt) {                                         
        this.entrarAlgo(Txt.getText());        
    } 
}

public class Controller implements VisaoInterface{
    @Override
    public void entrarAlgo(Integer algo) {
        this.modelo.fazerAlgo(algo);
    }
}

Obrigado.

5 respostas

Eu não acho que seria errado, em programação existe o compila e o não compila. O 1 e 0. Faz para aprender mesmo e veja se funciona.

Olá.

Já havia "compilado" essa ideia, mas ainda estou/estava inseguro com as consequencias. O jeito que penso sobre isso ficou assim: https://screenshot.net/pt/3ok8cz4

Lembrando que a interface proposta tem como objetivo apenas especificar os eventos de sistema, ou seja, é um evento externo gerado por um ator para o sistema capturado por uma GUI (View).

Obrigado.

Segue código teste:

public interface InterfaceVisaoController {

    void setNome(String nome);

    String getNome();

}

public class Controller implements InterfaceVisaoController {

    private Modelo modelo;

    public Controller() {
        this.modelo = new Modelo();

    }

    @Override
    public void setNome(String nome) {
        this.modelo.setNome(nome);
    }

    @Override
    public String getNome() {
        return this.modelo.getNome();
    }

}


public class Visao extends javax.swing.JFrame implements InterfaceVisaoController {

    private InterfaceVisaoController controller;

    public Visao(InterfaceVisaoController controller) {
        this.controller = controller;
        initComponents();
        setVisible(true);
    }

    private void initComponents() {

       //suprimido
    }                   

    private void btnSetNomeActionPerformed(java.awt.event.ActionEvent evt) {                                           
        this.controller.setNome(this.txtNome.getText());
        javax.swing.JOptionPane.showMessageDialog(null, this.controller.getNome());
    }                                          

    @Override
    public void setNome(String nome) {
        this.controller.setNome(nome);
    }

    @Override
    public String getNome() {
        return this.controller.getNome();
    }

    // Variables suprimidas          

}

Para que fins está fazendo esse projeto, é algo só pra aprender, projeto pessoal, projeto de faculdade ou projeto do trabalho?

Olá.

Apenas penso em aperfeiçoar tanto projetos pessoais, como projetos de trabalho.

Cara que conselho posso te dar. Projetos pessoais faça mesmo sem medo de errar. Agora quando fazer no trabalho tem que fazer com responsabilidade mas para isso existe o ambiente de teste. Você faz o programa e deixa testando até se sentir confortável com os resultados, se aparecerem problemas nessa etapa de teste tudo bem, você está testando.