Pergunta

A Interface Segregation Principle (ISP) diz que muitos cliente interfaces específicas são melhores do que uma interface de uso geral.Por que isso é importante?

Foi útil?

Solução

ISP afirma que:

Os clientes não devem ser forçados a depender sobre os métodos que eles não usam.

ISP se relaciona com importantes características - coesão e acoplamento.
Idealmente, os seus componentes devem ser altamente adaptado.Ele melhora o código de robustez e facilidade de manutenção.

Aplicação PROVEDOR lhe dá seguintes bônus:

  • Alta coesão - melhor inteligibilidade, robustez
  • Baixa acoplamento - melhor manutenção, alta resistência a mudanças

Se você quer aprender mais sobre design de software de princípios, de obter uma cópia de Desenvolvimento ágil de Software, Princípios, Padrões e Práticas livro.

Outras dicas

A interface de segregação é o "eu" SÓLIDO princípio, antes de cavar muito fundo com o primeiro, vamos explicar o que é que o último média.

SÓLIDO pode ser considerado um conjunto de melhores práticas e recomendações feitas por especialistas (o que significa que tem sido provado antes), a fim de fornecer uma base confiável em como nós aplicações de design.Essas práticas se esforçam para tornar mais fácil para manter, ampliar, adaptar e a escala das nossas aplicações.

Por que eu deveria me importar com SÓLIDA de programação?

Primeiro de tudo, você tem que perceber que você não vai ser para sempre onde você está.Se nós normas de utilização e bem conhecido arquiteturas, podemos ter certeza de que o nosso código vai ser fácil de manter por outros desenvolvedores que virão depois de nós, e eu tenho certeza que você não quer lidar com a tarefa de fixação de um código que não aplicou qualquer metodologia conhecida como seria muito difícil compreendê-lo.

A interface de segregação princípio.

Saber que nós sabemos o que os SÓLIDOS princípios, podemos entrar em mais detalhes sobre a Interface de Segregação princípio, mas o que exatamente faz a interface segregação diz?

"Os clientes não devem ser forçados a implementar desnecessários métodos que eles não vão usar"

Isto significa que, às vezes, tendemos a fazer interfaces com uma série de métodos, que podem ser boas para um ponto, no entanto, isso pode facilmente abusado, e que pode acabar com as classes que implementam vazio ou métodos inúteis que, naturalmente, adiciona código adicional e peso para as nossas aplicações.Imagine que você está declarando uma série de métodos em uma interface única, se você gosta do visual aids, uma classe que é a implementação de uma interface, mas que está realmente precisando de um par de métodos, de que teria esta aparência:

enter image description here

Por outro lado, se você aplicar corretamente a interface de segregação e dividir a sua interface em subconjuntos menores você pode me esqueça de implementar aqueles que somente são necessários:

enter image description here

Ver!É muito melhor!Aplicando este princípio vai permitir que você tenha baixo acoplamento, o que auxilia para uma melhor manutenção e alta resistência a mudanças.Então você pode realmente alavancar o uso de interfaces e implementação de métodos quando você realmente deve.Agora vamos analisar um a menos abstrato exemplo, digamos que você declarou uma interface chamada Reportável

public interface Reportable {

        void printPDF();
        void printWord();
        void printExcel();
        void printPPT();
        void printHTML();


}

E você tem um cliente que será apenas para exportar alguns dados em formato Excel, você pode implementar a interface, mas você só tem que implementar o método do excel?A resposta é não, você vai ter o código para a implementação de todos os métodos, mesmo se você não estiver indo para usá-los, isso pode causar um monte de lixo de código, portanto, tornar o código difícil de manter..

Lembre-se de mantê-lo simples e não repita você mesmo e você vai achar que você já está usando esse princípio sem saber.

Ele simplifica a interface que um cliente irá utilizar e remove dependências que eles poderiam desenvolver-se em partes da interface que eles não precisam.

Uma razão é que, tendo muitas interfaces com uma quantidade mínima de métodos para cada um facilita a implementação de cada interface e a implementá-las corretamente.Uma grande interface pode ser incontrolável.Além disso, usando uma interface focada em um cenário torna o código mais maintanable porque você pode ver que a faceta do objeto está sendo usado (por exemplo, uma interface IComparable permite que você saiba que o objeto está sendo usado apenas para efeitos de comparação, em um determinado cenário).

Este princípio serve principalmente twin fins

  • Para tornar o código mais legível e fácil de gerir.

  • Promove a responsabilidade única de classes ( alta coesão ).Claro por que uma classe tenha um método que não tem nenhum impacto comportamental ?Porque não é só remover ele.Isso é o que o ISP é de cerca de

Existem algumas perguntas que um designer deve pedir com preocupações ao ISP

  • O que se alcança com o PROVEDOR de internet
  • Como posso analisar um já existente de código para qualquer PROVEDOR de violações de

Para levar essa discussão adiante, devo também acrescentar que este princípio não é um "princípio", no sentido mais estrito, uma vez que, em determinadas circunstâncias, a aplicação de ISP para o projeto, em vez de promover a leitura, possa fazer com que a estrutura de objeto ilegível, confuso com o código desnecessário.Você pode observar isso em java.awt.pacote para o evento

Mais no meu blog: http://design-principle-pattern.blogspot.in/2013/12/interface-segregation-principle.html

ISP é importante.

A ideia básica do ISP :Cliente não devem ser forçados a depender de métodos não se usa.

Este princípio parece ser mais lógico.Idealmente cliente não deve implementar os métodos, que não são utilizados pelo cliente.

Consulte abaixo SE pergunta para exemplo de código:

Interface de Segregação Princípio - Programa para uma interface

Vantagens:

  1. Flexibilidade :Na ausência de ISP, você tem um Genérico de GORDURA interface e muitas classes de implementação.Suponha que você tivesse 1 interface e 50 classes.Se não houver uma mudança na interface, todos os 50 classes de ter de alterar a sua implementação.

    Com o PROVEDOR de internet, você vai dividir genérico de GORDURA interface em fina granular pequena interfaces.Se houver uma alteração na pequena granular interface, apenas as classes de implementação para essa interface será afetado.

  2. Facilidade de manutenção e Facilidade de uso:Desde que as mudanças estão limitadas a fina granular de interface em vez do genérico FATO de interface, o código é mais fácil de manutenção.Não relacionado a código não é mais parte da classe de implementação.

Para evitar a regressão esforços, quando apenas um cliente específico ou um comportamento específico alterações.Se você tiver combinado todo o seu comportamento métodos de tudo uma GRANDE interface, apenas pense em como vai acabar o teste de todas as partes do código, onde tudo que você tem que se refere é a interface, mesmo quando apenas pequenas mudanças aconteceram.

Para uma explicação mais detalhada, consulte Interface de segregação princípio do artigo

Robert Martin de papel sobre o assunto, dá uma explicação que é mencionado com menos frequência:

O para trás, a força aplicada pelos clientes sobre interfaces.

Se duas classes dependem diretamente de dois métodos diferentes de uma terceira classe, que aumenta a probabilidade de que alterações em qualquer uma das duas primeiras classes irá afetar o outro.

Suponha que temos três classes: Red, Green, e Blue.

Red e Green ambos dependem Blue, mas cada um depende de um método diferente.O que significa que Red depende de um método de Blue mas não usar outro método.Da mesma forma, Green depende Blue, mas usa apenas um método, e não os outros.

A violação do princípio está em Red e Green porque cada um depende de uma classe - Blue - mas não use pelo menos um de seus métodos.

Qual é o problema que faz isso potencialmente criar?

  • Eu preciso mudar Red, e eu também alterar Blue para acomodar as necessidades de Red.
  • Eu não tiver alterado o método específico dentro Blue que Green depende, mas mesmo assim, Green depende Blue e eu mudei Blue, que ainda poderia impacto Green.
  • Portanto, a minha mudança para Red têm o potencial de impacto Blue porque eles me levaram para alterar uma classe que tanto dependem.

Que o "para trás de força." Nós, às vezes, a mudança de uma classe, porque as necessidades de seus clientes.Se essa classe tem diferentes clientes que o utilizam para coisas diferentes, corremos o risco de afetar-los.

Como afirmado, a simples definição da Interface Segregação Princípio é:

nenhum cliente deve ser forçados a depender de métodos não se usa.

Entre essa e acima do ponto de Robert Martin de papel, é evidente que muitas explicações para os ISP estão na verdade falando sobre outros princípios.

  • Classes ou interfaces com vários métodos são indesejáveis, mas não especificamente por causa do ISP.Eles podem violar a Responsabilidade Única.Mas o ISP violação não é nas grandes interface ou grande classe - é nas classes que dependem no grande interface, se eles não usam todos os seus métodos.Se eles usam todos os métodos que ainda soa confuso, mas que não tem nada a ver com o ISP.
  • Classes que implementam uma interface, mas jogar exceções para certos métodos são ruins, mas esse não é o ISP, qualquer um.O ISP é de cerca de classes que dependem em interfaces, classes que não implementar interfaces.

Se nós Google "interface " segregação", a maioria dos principais resultados que incluem amostras de código demonstrar classes que não totalmente implementar interfaces, o que não é o ponto de ISP.Alguns até refaça o princípio:

A Interface de Segregação Princípio indica que os clientes não devem ser forçados a implementar interfaces de eles não usam

...mas que é não a princípio.A definição do papel menciona tais preocupações como um efeito colateral de violar a ISP, mas indica que eles são Liskov Substitution violações.

Além disso, cada vez que uma nova interface foi adicionada para a classe base, que a interface deve ser implementadas (ou padrão) em classes derivadas.De fato, associada a prática é adicionar essas interfaces para a classe base como nil funções virtuais, ao invés de incluir funções virtuais puras;especificamente para as classes derivadas não são sobrecarregados com a necessidade de implementá-las.Como aprendemos no segundo artigo desta coluna, tal prática viola o Liskov Substitution Principle (LSP), levando-o a manutenção e a reutilização de problemas.

Além do mais, dizer que um cliente não deve implementar métodos que não utilizam nem mesmo faz sentido.O clientes de uma interface não implementar seus métodos.

Eu não quero pomposamente citar o papel, como se as sagradas escrituras, ou algo assim.Mas, se vamos usar o nome do princípio descrito no artigo (nome do artigo), então devemos também considerar a real definição e explicação contida no artigo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top