3 de abril de 2012

Sobrevivente.run()

Como sobreviver sem repetição de código no reino dos substantivos?

O que fazer quando encontramos código deste tipo:

A.java

Button button = new Button("Limpar");
button.addActionListener(new ActionListener() {
  public void performAction() {
    if (foo) {
      askConfirmation();
      bar.clear();
    }
  }
});

B.java

Button button = new Button("Limpar");
  button.addActionListener(new ActionListener() {
    public void performAction() {
      if (bacon) {
        askConfirmation();
        eggs.clear();
      }
    }
});

C.java

Button button = new Button("Limpar");
button.addActionListener(new ActionListener() {
  public void performAction() {
    if (baz) {
      askConfirmation();
      spam.clear();
    }
  }
});

Meu jeito é criar um verbo disfarçado de substantivo que leva consigo a ação que eu quero:

interface MagicClearWord {
  boolean isDirty();
  void clear();
}
class MagicClearWordExecutor implements ActionListener {
  private final MagicClearWord e;
  MagicClearWordExecutor(MagicClearWord e) {
    this.e = e;
  }
  public void performAction() {
    if (e.isDirty()) {
      askConfirmation();
      e.clear();
    }
  }
}

E depois utilizar como se fosse um "substantivo anônimo" (#nonsense):

A.java

Button button = new Button("Limpar");
button.addActionListener(new MagicClearWordExecutor(
  new MagicClearWord() {
    public boolean isDirty() {
      return foo;
    }
    public void clear() {
      bar.clear();
    }
  })
);

B.java

Button button = new Button("Limpar");
button.addActionListener(new MagicClearWordExecutor(
  new MagicClearWord() {
    public boolean isDirty() {
      return bacon;
    }
    public void clear() {
      eggs.clear();
    }
  })
);

C.java

Button button = new Button("Limpar");
button.addActionListener(new MagicClearWordExecutor(
  new MagicClearWord() {
    public boolean isDirty() {
      return baz;
    }
    public void clear() {
      spam.clear();
    }
  })
);

Ainda assim os substantivos e seus amigos gulosos comem seu tempo e seu espaço em disco com tanta palavra vazia. Parece que estamos presos mesmo.

Oh God, why?

Nenhum comentário:

Postar um comentário