Inspirado por esta pergunta Usando bibliotecas de terceiros - sempre use um wrapper? Eu queria saber o que as pessoas realmente consideram como bibliotecas de terceiros.
Exemplo do PHP:
Se estou criando um aplicativo usando a estrutura do Zend, devo tratar as bibliotecas da estrutura do Zend como código de terceiros?
Exemplo de C #:
Se estou criando um aplicativo de desktop, devo tratar todas as classes .Net como código de terceiros?
Exemplo de Java:
Devo tratar todas as bibliotecas no JDK como bibliotecas de terceiros?
Algumas pessoas dizem que, se uma biblioteca é estável e não muda frequentemente, não é necessário agrupá-la. No entanto, não consigo ver como alguém testaria uma classe que depende de um código de terceiros sem agrupá-lo.
Respostas:
Seus exemplos são todos códigos de terceiros, mas você não deve escrever wrappers para eles. São projetos grandes e maduros, com APIs estáveis e bem planejadas.
A necessidade de wrappers é fornecer uma camada de abstração entre seu código e a biblioteca. Você só precisa dessa abstração quando descobrir que uma biblioteca não fornece boas APIs para o que você está fazendo. Em seguida, você pode criar o wrapper para simplificar seu próprio código e ocultar o fato de que as chamadas à API são estranhas.
Seu código poderá ser testado se você usar injeção de dependência. Nos testes de unidade, você pode trocar a dependência da biblioteca por um objeto simulado, permitindo isolar seu código em teste.
fonte
Zend_Mail
simulação que você passa para oLogger
objeto em teste. O PHP não suporta digitação de patos? Nesse caso, não deveria ser trivial criar um objeto simulado ...? Eu realmente não sei PHP, mas você pode ver exemplos de bibliotecas de zombaria do PHP para ver como isso é feito. Em idiomas que não oferecem suporte à digitação de patos, acho que você precisaria mudarZend_Mail
para uma interface e criar um invólucro fino que implementa a interface e herdaZend_Mail
ou apenas delega todas as chamadas.Zend_Mail
foi meu primeiro pensamento, mas como você pode ver no meu post original antes de editá-lo, usei uma interface e um invólucro que o implementa. No entanto, o único propósito do wrapper de existir é para que eu possa zombar de sua interface. Isso é comum em idiomas que não suportam digitação de patos? Construindo um número infinito de invólucros, quero dizer?O objetivo de agrupar uma biblioteca é quebrar a dependência do seu próprio código nessa biblioteca para ativar:
Isolar bibliotecas e estruturas de terceiros é apenas um subconjunto de isolar alterações.
fonte
Eu não trataria os membros da biblioteca padrão como código de terceiros - afinal eles são padrão e podem razoavelmente estar disponíveis e funcionais na plataforma que você está usando.
Quanto a algo como o Zend, acho que não seria necessário envolvê-lo - você provavelmente precisaria reescrever o programa se adotasse uma estrutura diferente. Para ser sincero, eu não envolvia muita coisa que não fosse uma dependência de configuração externa séria ou se não estava realmente planejando tornar essa peça intercambiável.
fonte
Eu consideraria as bibliotecas fornecidas por uma linguagem de programação específica como apenas parte da linguagem.
Então, eu consideraria terceiros, todas as bibliotecas fornecidas por qualquer outra entidade como uma extensão ou uma ferramenta separada da própria linguagem de programação.
Tomando o seu exemplo, consideraria o Zend um terceiro. Também construiria meu aplicativo de uma maneira que minha lógica de negócios principal não dependesse do Zend.
A Wikipedia define componentes de terceiros como:
fonte
No sentido estrito, todos os exemplos que você deu são códigos de terceiros. No entanto, nem todos os códigos de terceiros devem ser quebrados. Todas as bibliotecas de terceiros devem ser agrupadas. Estruturas, por definição, não podem ser agrupadas porque se tornam parte integrante do seu código. É por isso que você agruparia sua biblioteca de log, mas não a estrutura .NET ou Zend. Você não pode realmente separar seu código do .NET - eles estão entrelaçados. Obviamente, boas estruturas terão interfaces para programar, permitindo que você ignore o problema até certo ponto.
Consulte também: /programming/148747/what-is-the-difference-between-a-framework-and-a-library
fonte