Padrão para atribuir responsabilidades: Baixo Acoplamento

Problema

Solução

Exemplo

18-8a.gif (1498 bytes)

18-9.gif (2468 bytes)

18-10.gif (2585 bytes)

Discussão

Acoplamento de dados

class Servidor {
  public void mensagem(MeuTipo x) {
    // código aqui
    x.façaAlgo(Object dados); // dados e x estão acoplados
                              // (se interface de dados mudar x terá que mudar)
    // mais código
  }
}
class Aluno {
  String nome;
  long   matrícula;
     
  public String getNome() { return nome; }
  public long   getMatrícula() { return matrícula; }

  // etc.
}

ListaOrdenada listaDeAlunos = new ListaOrdenada();
listaDeAlunos.add(new Aluno(...));
//etc.
class ListaOrdenada {
  Object[] elementosOrdenados = new Object[tamanhoAdequado];

  public void add(Aluno x) {
    // há código não mostrado aqui
    long matrícula1 = x.getMatrícula();
    long matrícula2 = elementosOrdenados[k].getMatrícula();
    if(matrícula1 < matrícula2) {
      // faça algo
    } else {
      // faça outra coisa
    }
  }
class ListaOrdenada {
  Object[] elementosOrdenados = new Object[tamanhoAdequado];

  public void add(Aluno x) {
    // código não mostrado
    if(x.compareTo(elementosOrdenados[K]) < 0) {
      // faça algo
    } else {
      // faça outra coisa
    }
  }
interface Comparable {
  public int compareTo(Object outro);
}

class Aluno implements Comparable {
  public int compareTo(Object outro) {
    // compare registro de aluno com outro
    // retorna valor < 0, 0, ou > 0 dependendo da comparação
  }
}

class ListaOrdenada {
  Object[] elementosOrdenados = new Object[tamanhoAdequado];

  public void add(Comparable x) {
    // código não mostrado
    if(x.compareTo(elementosOrdenados[K]) < 0) {
      // faça algo
    } else {
      // faça outra coisa
    }
  }

Acoplamento de controle

class Lampada {
  public final static int ON = 0;

  public void setLampada(int valor) {
    if(valor == ON) {
      // liga lampada
    } else if(valor == 1) {
      // desliga lampada
    } else if(valor == 2) {
      // pisca
    }
  }
}

Lampada lampapa = new Lampada();
lampada.setLampada(Lampada.ON);
lampada.setLampada(2);
class Lampada {
  public void on() { // liga lampada }
  public void off() { // desliga lampada }
  public void pisca() { // pisca }
}

Lampada lampada = new Lampada();
lampada.on();
lampada.pisca();
class Teste {
  public int printFile(File aImprimir) {
    if(aImprimir está corrompido ) {
      return CORRUPTFLAG;
    }
    // etc. etc.
  }
}

Teste umTeste = new Teste();
int resultado =  umTese.printFile(miniTeste);
if(resultado == CORRUPTFLAG) {
  // oh! oh!
} else if(resultado == -243) {
  // etc. etc.
class Teste {
  public int printFile(File aImprimir) throws PrintExeception {
    if(aImprimir está corrompido ) {
      throw new PrintExeception();
    }
    // etc. etc.
  }
}

try {
  Teste umTeste = new Teste();
  umTeste.printFile(miniTeste);
} catch(PrintException printError) {
  // mail para a turma: não tem miniteste amanhã!
}

Acoplamento de dados globais

Acoplamento de dados internos

Consequências

Exercício para casa

programa