Acoplamento em Desktop (Exception)?

5 respostas
pedromuyala

Olá companheiros gujeiros, boa noite!

Quando procuro assuntos sobre redução de acoplamento sempre me deparo com a galera indicando o uso de IoC (Inversão de Controle).
Mas o uso de interfaces também é muito bem adequado quando se fala em Desktop. Vejam o código exemplo abaixo:

import javax.swing.*;

class View extends JFrame implements ModelListener {

   private ActionListener control1;
   private FocusListener control2;

   public View(ActionListener control1, FocusListener control2) {
      this.control1 = control1;
      this.control2 = control2;
      this.executar();
   }

   public void executar() {
      JPanel painel = new JPanel();
   
      JButton bot = new JButton("Enviar");
      bot.addActionListener(control1);
      painel.add(bot);
   
      JTextField tex = new JTextField(5);
      tex.addFocusListener(control2);
      painel.add(tex);

      add(painel);
   }
   
   public void atualizar(ModelEvent e) {
      // ... Atualizar a visão quando alterado o modelo
   }
}
public class ControlaBotao implements ActionListener {...}
public class ControlaTexto implements FocusListener {...}
public class ObjetoModelo implements Modelo {...}
public class Cadastro {
   
   public static void main (String args[]) {
      ObjetoModelo model = new ObjetoModel(); 
      ControlaBotao cb = new ControlaBotao(model);
      ControlaTexto ct = new ControlaTexto(model);
      View visao = new View(cb, ct);
      visao.setVisible(true);
   }
}

Vejam, não existe acoplamento a não ser dentro do método main. Usando interfaces, a visão está desacoplada dos seus controladores, certo?
O mesmo vale para o “controlador -> modelo” e “modelo -> visão” seguindo as regras do MVC!
Ps: Não riam por favor que nem um colega meu que disse: “Puxa vida eu também adoraria enxergar isso como um código desacoplado… difícil vai ser convencer os demais!”

Por favor não deixem de opinar, sugerir, criticar…
Fico no aguardo pelas respostas pessoal! Agradeço muito a atenção de todos vocês! :idea:
O GUJ é forte justamente pela boa vontade das pessoas em ajudar e é isso que o faz crescer a cada dia mais. [color=red]OBRIGADO![/color]

5 Respostas

ViniGodoy

Eu sempre usei eventos e interfaces e sempre acabei com um código elegante e desacoplado. Só vi a necessidade de IoC para trechos de código onde queria injetar plugins. Ainda assim, não adianta ter só o IoC, você tem que projetar todo o sistema ao redor para suportar adequadamente o plugin.

Aliás, como a aplicação Desktop geralmente roda em apenas uma única máquina, não tem porque você ter um modelo MVC tão complexo quanto as mesmas aplicações em web.

pedromuyala

Exatamente Vinícius. Pode verificar o código acima utiliza eventos para comunicar as 3 partes e se beneficia com o uso de interfaces.
Se alguém tem alguma sugestão ou crítica por favor não deixe de postar. Sua opinião é muito importante para todos nós!
Fico no aguardo por mais respostas! OBRIGADO!

pedromuyala

Surgiu um problema: Quando ocorre uma Exception em control1 ou control2 eu não consigo tratar na visão justamente porque não tem onde colocar o try{}.
Alguém tem alguma idéia de como fazer a visão receber essas exceções para poder tratar? Obrigado.

pedromuyala

Sem chance? Nada mesmo?

ViniGodoy

Esse é um problema sério de todos os listeners de componentes Swing, eles tem que dar garantia de NoThrow. Senão, a exceção vai subir até a thread do Swing, que não foi preparada para lidar com isso.

O máximo que você pode fazer é gerar uma RuntimeException e loga-la registrando um UncaughtExceptionHandler

Criado 4 de outubro de 2009
Ultima resposta 5 de out. de 2009
Respostas 5
Participantes 2