Princípios de Design de Software – Interface Segregation Principle

Neste post vamos analisar o Princípio da Segregação de Interfaces (Interface Segmentation Principle – ISP), que possui uma ideia simples, mas é considerado difícil de se alcançar. Também foi utilizado como texto base o seminal de Robert C. Martin [1].

Interface Segmentation Principle

O principio diz basicamente que o cliente não deve utilizar interfaces das quais não precise. Uma maneira bem simples de entender o princípio, descrita em [1], é: considere um conjunto de clientes que possuem necessidades diferentes em alguns pontos, utilizar uma única interface que oferece vários métodos para todos os clientes fere o princípio, pois como os clientes possuem necessidades diferentes, esta interface acaba por oferecer métodos que não são necessários a todos os clientes.

Observe a imagem a seguir, nesse design todos os clientes utilizam uma mesma interface, assim, esta interface deve oferecer métodos que supram as necessidades de todos os clientes.

Essa classe “SuperInterface” fere o ISP, pois os clientes são obrigados a utilizar uma interface a qual não necessitam. As implementações desta interface precisarão também suprir as necessidades dos clientes, implementando métodos que não serão utilizados e/ou não são de sua responsabilidade.

Em [2] é mostrado como a API de coleções do Java segue o princípio, oferecendo conjuntos de interfaces específicas e genéricas para que o desenvolvedor escolha conforme sua necessidade:

Se um método precisa apenas percorrer uma coleção, pode ser utilizada a interface Iterable, no entanto, se for preciso acessar elementos através de índices, ou outras informações sobre a coleção, será necessário alterar o método. A chave para este princípio está em balancear as necessidades e o desacoplamento do código. [2]

Padrões de Projeto

Um ótimo exemplo de padrão de projeto para discutir o ISP é o padrão Composite. Lembra da discussão sobre colocar os métodos de gerenciamento da lista dos objetos compostos na interface geral ou na interface específica?

O ponto central da discussão é se a interface geral deve ser genérica o suficiente para que todos os clientes tenham acesso a todos os métodos (incluindo os métodos de gerenciamento da lista de objetos compostos), sem a necessidade de verificação de tipo, ou se a interface deve ser segregada, utilizando assim uma interface específica com métodos para gerenciar a lista de objetos compostos.

Outro bom exemplo de discussão sobre o princípio é o Adapter. Nele é preciso oferecer uma nova interface que adapte uma classe já existente as necessidades do cliente. Os outros padrões sempre oferecem uma interface para o cliente (baseado no princípio do próximo post) e esta interface possui um design bem simples, mas que atende as necessidades dos clientes.

Se o design já está feito, utilizar o padrão Adapter pode ser uma excelente saída para oferecer várias interfaces segregadas específicas para as necessidades dos clientes.

Se gostou do post compartilhe com seus amigos e colegas, senão, comente o que pode ser melhorado. Possui alguma outra opinião ou alguma informação adicional? Comenta ai! 😀

Referências:

[1] http://www.objectmentor.com/resources/articles/isp.pdf

[2] Silveira, P. et. al. Introdução à Arquitetura e Design de Software. Rio de Janeiro: Elsevier, 2012.

[3] http://www.oodesign.com/interface-segregation-principle.html

Anúncios

Um comentário sobre “Princípios de Design de Software – Interface Segregation Principle

  1. […] princípios: Single responsibility principle Open/closed principle Liskov substitution principle Interface segregation principle Dependency inversion […]

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s