¿Qué se considera código de terceros?

15

Inspirado por esta pregunta Uso de bibliotecas de terceros: ¿siempre usa un contenedor? Quería saber lo que la gente realmente considera bibliotecas de terceros.

Ejemplo de PHP:
si estoy creando una aplicación usando Zend Framework, ¿debo tratar las bibliotecas Zend Framework como código de terceros?

Ejemplo de C #:
si estoy creando una aplicación de escritorio, ¿debería tratar todas las clases .Net como código de terceros?

Ejemplo de Java:
¿Debería tratar todas las bibliotecas del JDK como bibliotecas de terceros?

Algunas personas dicen que si una biblioteca es estable y no cambiará con frecuencia, entonces no es necesario ajustarla. Sin embargo, no veo cómo se probaría una clase que depende de un código de terceros sin envolverla.

Songo
fuente
8
¿Puede el votante negativo explicar por qué?
Songo
He oído hablar de software de terceros, pero no del código de terceros. La mayoría de los terceros no le dan su código fuente.
Tulains Córdova

Respuestas:

18

Sus ejemplos son todos códigos de terceros, pero no debe escribir contenedores para ellos. Son proyectos grandes y maduros con API estables y bien planificadas.

La necesidad de envoltorios es proporcionar una capa de abstracción entre su código y la biblioteca. Solo necesita esta abstracción cuando descubre que una biblioteca no proporciona buenas API para lo específico que está haciendo. Luego, puede crear el contenedor para simplificar su propio código y ocultar el hecho de que las llamadas a la API son incómodas.

Su código será verificable si usa la inyección de dependencia. En sus pruebas unitarias, puede intercambiar la dependencia de la biblioteca con un objeto simulado, lo que le permite aislar su código bajo prueba.

M. Dudley
fuente
+1 para explicar cuándo puede ser necesario un envoltorio o fachada, si lo desea.
Joshua Drake el
Gracias por la respuesta, pero con respecto al último párrafo sobre pruebas unitarias, ¿podría echar un vistazo a esta pregunta en la que estoy tratando de probar unidades en una clase que depende directamente del marco de una biblioteca?
Songo
@Songo: Su estrategia de prueba debe ser crear un Zend_Mailsimulacro que pase a su Loggerobjeto bajo prueba. ¿PHP no admite la escritura de pato? Si es así, ¿no debería ser trivial crear un objeto simulado ...? Realmente no conozco PHP, pero podría ver ejemplos de bibliotecas simuladas de PHP para ver cómo se hace normalmente. En los idiomas que no admiten la escritura de pato, entonces creo que necesitaría cambiar Zend_Maila una interfaz y luego crear una envoltura delgada que implemente la interfaz y herede Zend_Mailo simplemente delegue todas sus llamadas.
M. Dudley
@emddudley bueno, sí, pero estaba buscando una solución más general al problema en otros idiomas que no sea compatible con la escritura de pato. En realidad, mi solución para envolver Zend_Mailfue mi primer pensamiento, pero como puede ver en mi publicación original antes de editarlo, utilicé una interfaz y un contenedor que lo implementa. Sin embargo, el único propósito del contenedor es existir para que pueda burlarme de su interfaz. ¿Es eso común en los idiomas que no admiten la escritura de pato? ¿Construir infinito no de envoltorios quiero decir?
Songo
@Songo: Creo que es muy específico del idioma y de la biblioteca, y tienes que conformarte con lo que sea compatible con tu plataforma. A veces puede estar atrapado con envoltorios de escritura. La inyección de dependencia y la burla de objetos son desarrollos bastante recientes (2004?), Por lo que no todos los idiomas y bibliotecas los admiten muy bien. La "solución general" que está buscando es solo una mentalidad: ¿cómo puede diseñar su código para un acoplamiento flexible y pruebas unitarias efectivas?
M. Dudley
6

El objetivo de concluir una biblioteca es romper la dependencia de su propio código en esa biblioteca para habilitar:

  • Prueba unitaria: debe poder probar su código. Si una biblioteca no le permite burlarse de las clases o forzar las respuestas que necesita para su prueba, entonces deberá ajustar esa biblioteca. Este es un problema obvio, y probablemente no sea el caso del que se esté preguntando.
  • Cambios en las implementaciones: como autor del código, debe comprender los cambios que probablemente se le presenten y cuánto costará prepararlos en comparación con la probabilidad de que sean. ¿Se puede cambiar de .NET a JVM? Eso es difícil e improbable; sin embargo, es muy probable que cambie las tecnologías de IU en el futuro, o los motores XML.

Aislar bibliotecas y marcos de terceros es solo un subconjunto de aislar el cambio.

Ben
fuente
Muy buen punto sobre las pruebas unitarias. No digo que siempre termine para poder probar su aplicación de forma unitaria, pero es una buena estrategia para desacoplar dependencias cuando sea necesario.
Sergio Acosta el
2

No trataría a los miembros de la biblioteca estándar como código de terceros; después de todo, son estándar y se puede suponer razonablemente que están disponibles y son funcionales en la plataforma que está utilizando.

En cuanto a algo como Zend, creo que uno no lo envolvería; probablemente necesitaría reescribir el programa si adoptara un marco diferente. Para ser honesto, no envolvería mucho que no fuera una seria dependencia de configuración externa o si realmente no planeara hacer que esa pieza sea intercambiable.

Wyatt Barnett
fuente
2

Consideraría las bibliotecas proporcionadas por un lenguaje de programación específico como solo parte del lenguaje.

Entonces, consideraría un tercero, todas las bibliotecas proporcionadas por cualquier otra entidad como una extensión o una herramienta separada del lenguaje de programación en sí.

Tomando su ejemplo, consideraría a Zend como un tercero. También construiría mi aplicación de manera que mi lógica comercial central no dependa de Zend.

Wikipedia define un componente de terceros como:

En la programación de computadoras, un componente de software de terceros es un componente de software reutilizable desarrollado para ser distribuido o vendido libremente por una entidad que no sea el proveedor original de la plataforma de desarrollo.

Patkos Csaba
fuente
1

En el sentido más estricto, cada ejemplo que dio es un código de terceros. Sin embargo, no todo el código de terceros debe estar envuelto. Todas las bibliotecas de terceros deben estar envueltas. Los marcos, por definición, no se pueden ajustar porque se convierten en parte integral de su código. Es por eso que envolvería su biblioteca de registro, pero no el marco .NET o el marco Zend. Realmente no puede separar su código de .NET, están entrelazados. Por supuesto, los buenos marcos tendrán interfaces para programar, lo que le permitirá evitar el problema hasta cierto punto.

Ver también: /programming/148747/what-is-the-difference-between-a-framework-and-a-library

Miguel
fuente