28 de agosto de 2016

Assunto abordado por Myers (1978), podemos definir a interação que ocorre entre dois módulos como conectividade, e a intensidade dessa conectividade, como acoplamento.  Quando dizemos que dois módulos estão fortemente acoplados significa que eles possuem alto grau de conectividade, ou seja, que um deles possui um conhecimento indevido da implementação do outro e pode estar com uma forte dependência desse outro módulo. Para ilustrar, vamos exemplificar com a falta de uso dos modificadores corretos na seguinte implementação:

public class Aluno {
   
    public String nome;
    public String sexo;
    public String telefone;
    public String endereco;
   
    public Aluno(String nome, String sexo,
    String telefone, String endereco){
   
    this.nome = nome;
    this.sexo = sexo;
    this.telefone = telefone;
    this.endereco = endereco;
   
    }
}

public class Aplicacao {
   
    public static String consultarAluno(Aluno aluno){
       
        String alun = aluno.nome;
        String sex = aluno.sexo;
        String tel = aluno.telefone;
        String end = aluno.endereco;
       
        return alun + sex + tel + end;
    }
       
    public static void main(String[] args){
       
        Aluno kenia = new Aluno("Kênia", "Feminino",
        "031 986578909", "Rua das estrelas...");
       
        String imprimeAluno = consultarAluno(kenia);       
        System.out.print(imprimeAluno);
       
    }                           
}

Na implementação mostrada, a classe Aluno possui todos os seus atributos púbicos, e a classe Aplicacao consegue acessar esses atributos diretamente. Essas classes têm um alto grau de acoplamento, pois, a classe Aluno deveria ter atributos privados e disponibilizar ela mesma, métodos para a consulta desses atritutos. Da forma como está, a classe Aplicacao conhece detalhes de implementação da classe Aluno que não precisa conhecer. Na correção da implementação, teríamos essas classes funcionando da seguinte forma:

public class Aluno {
   
    private String nome;
    private String sexo;
    private String telefone;
    private String endereco;
   
    public Aluno(String nome, String sexo,
    String telefone, String endereco){
   
        this.nome = nome;
        this.sexo = sexo;
        this.telefone = telefone;
        this.endereco = endereco;
   
    }
   
    public String consultarAluno(Aluno aluno){
        String name = aluno.nome;
        String sex = aluno.sexo;
        String tel = aluno.telefone;
        String end = aluno.endereco;
       
        return name + sex + tel + end;       
       
    }
}

public class Aplicacao {
   
    public static void main(String[] args){
       
        Aluno kenia = new Aluno("Kênia", "Feminino",
        "031 986578909", "Rua das estrelas...");
       
        String imprimeAluno = kenia.consultarAluno(kenia);   
        System.out.print(imprimeAluno);
    }       
}

Nessa implementação, Aluno tem seus atributos privados e outras classes não conseguirão acessá-lo diretamente. Essa medida aumentou a segurança e reduziu o acoplamento. A classe Aplicacao agora precisa acessar o método consultarAluno diretamente na classe Aluno para imprimir os dados de um aluno. Caso fosse necessária alguma manutenção na implementação anterior no método consultarAluno, possivelmente faríamos um número parecido de alterações nas duas classes. Na implementação atual, caso fosse necessária alguma alteração no método consultarAluno, a alteração maior seria feita na classe Aluno e talvez fosse preciso alterar somente a chamada do método na classe Aplicacao.

No primeiro exemplo com a ausência dos modificadores corretos, foi obtido o acoplamento por conteúdo que é o mais alto grau de acoplamento. No segundo exemplo com o emprego do uso dos modificadores corretos, foi obtido o acoplamento por informação que é o mais baixo grau de acoplamento. Essas e outras formas de acoplamento foram propostos por Myers (1978) na seguinte ordem crescente:

1.    Por informação: conectividade entre módulos por chamada de métodos com passagem de parâmetro por valor.

2.    Por referência: conectividade entre módulos por chamada de métodos com passagem de parâmetro por referência. No caso de Java, trata-se de passagem de parâmetros que sejam referências a objetos.

3.    Por controle: módulo que conhece a implementação de métodos de outro e passa a ele parâmetros para controlar sua execução.

4.    Por dado externo: módulos que dependem de objetos externos.

5.    Por inclusão: não existe em Java. Trata-se de um módulo que inclui código de outro componente.

6.    Por dado comum: módulos diferentes que fazem acesso comum a objetos globais.

7.    Por conteúdo: módulo com acesso direto a objetos de outro módulo.

É importante sempre observar a implementação para reduzir ao máximo o nível de acoplamento. Reduzir o acoplamento é importante, pois, aumenta a coesão e reduz o custo da manutenção. Um módulo funcionando de forma ideal possui baixo acoplamento.

Referência:



MYERS, G. J. Composite/Structured Design. 1. ed. New York: Van Nostrand Reinhold, 1978.

0 comentários:

Postar um comentário

Comentários:

Perfil

Formada em Sistemas de Informação e pós-graduada em Engenharia de Software.

Facebook

Views