O que é considerado código de terceiros?

15

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.

Songo
fonte
8
O eleitor de baixa patente pode explicar o porquê?
Songo
Ouvi falar de software de terceiros, mas não de código de terceiros. A maioria dos terceiros não fornece o código fonte.
Tulains Córdova 6/11/12

Respostas:

18

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.

M. Dudley
fonte
+1 para explicar quando um invólucro ou fachada, se desejar, pode ser necessário.
21430 Joshua Drake #:
Obrigado pela resposta, mas com relação ao último parágrafo sobre teste de unidade, você pode dar uma olhada nesta pergunta em que estou tentando testar uma unidade que tem dependência direta de uma estrutura de biblioteca?
Songo
@Ongo: sua estratégia de teste deve ser criar uma Zend_Mailsimulação que você passa para o Loggerobjeto 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 mudar Zend_Mailpara uma interface e criar um invólucro fino que implementa a interface e herda Zend_Mailou apenas delega todas as chamadas.
M. Dudley
@emddudley bem, sim, mas eu estava procurando uma solução mais geral para o problema em outros idiomas que não suporta digitação de patos. Na verdade, sua solução para quebrar Zend_Mailfoi 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?
Songo
@Ongo: Eu acho que é muito específico da linguagem e da biblioteca, e você tem que se contentar com o que sua plataforma suportar. Às vezes, você pode ficar preso a invólucros de escrita. Injeção de dependência e zombaria de objetos são desenvolvimentos relativamente recentes (2004?), Portanto nem todas as linguagens e bibliotecas os suportam muito bem. A "solução geral" que você está procurando é apenas uma mentalidade: como você pode arquitetar seu código para acoplamento flexível e teste de unidade eficaz?
M. Dudley
6

O objetivo de agrupar uma biblioteca é quebrar a dependência do seu próprio código nessa biblioteca para ativar:

  • Teste de unidade - Você deve poder testar seu código. Se uma biblioteca não permitir que você zombe das classes ou force as respostas necessárias para seu teste, será necessário agrupar essa biblioteca. Este é um problema óbvio, e provavelmente não é o caso que você está pensando.
  • Alterando implementações - Como autor do código, você precisa entender as mudanças que provavelmente aparecerão e quanto custará essas mudanças para se preparar, em comparação com a probabilidade delas. Você pode mudar do .NET para JVM? Isso é difícil e improvável; no entanto, é muito provável que você mude as tecnologias da interface do usuário no futuro ou os mecanismos XML.

Isolar bibliotecas e estruturas de terceiros é apenas um subconjunto de isolar alterações.

Ben
fonte
Muito bom ponto sobre o teste de unidade. Não estou dizendo que sempre envolva para poder testar sua aplicação, mas é uma boa estratégia para dissociar dependências quando necessário.
Sergio Acosta
2

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.

Wyatt Barnett
fonte
2

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:

Na programação de computadores, um componente de software de terceiros é um componente de software reutilizável desenvolvido para ser distribuído ou vendido livremente por uma entidade que não seja o fornecedor original da plataforma de desenvolvimento.

Patkos Csaba
fonte
1

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

Michael
fonte