20 de novembro de 2016
 

O princípio da inversão da dependência, também abordado no livro de Martin (2006) e conhecido pela sigla DIP, sugere abstração de dados. Esse princípio estabelece que o código cliente conheça um objeto somente por sua interface. De acordo com Martin (2006) módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender de abstrações. Abstrações não devem depender de detalhes. Detalhes devem depender de abstrações. No exemplo a seguir, podemos demonstrar uma violação de princípio com a seguinte implementação para efetuar cópia de arquivo:

public class A {

    public void copia(byte device) {

        char c; R r = new R(...); W1 w1; W2 w2;

        if (device == D1) w1 = new W1(....);
        else w2 = new W2 (...);
        while ( (c = r.read()) != EOF ) {
            if (device == D1) w1.write(c);
            else w2.write(c);
        }
    }   
}

Nessa implementação, a classe A depende das classes R, W1 e W2, classes concretas. O problema está ocorrendo porque o método copia sempre testa qual o dispositivo para saber onde imprimir. Ele entra nos detalhes de cada dispositivo passado como parâmetro, nesse caso, um método de alto nível está dependendo de detalhes de um módulo de nível mais baixo.

Verifique agora a solução do problema:

public interface Reader {public char read( );}

public interface Writer{public void write(char c);}

public class A {
    public void copia(Reader r, Writer w) {
        char c;
        while ( ( c = r.read( )) != EOF ) {
            w.write(c);
        }
    }
}

Na nova implementação foram implementadas interfaces específicas para Reader e Writer. Agora o método cópia não precisa mais testar o dispositivo antes de realizar a impressão. Essa responsabilidade é de quem chama o método cópia. Estar de acordo com o DIP facilita a manutenção e traz robustez aos códigos, além de contribuir com encapsulação de dados.

Referência:

MARTIN, R.C.; MARTIN, M. Agile Principles, Patterns, and Practices in C#. 1. ed. New Jersey: Prentice Hall, 2006.

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