terminology - meta tags ejemplos
¿Qué es un Shim? (6)
Como pudimos ver en muchas respuestas aquí, un shim es un tipo de adaptador que proporciona funcionalidad a nivel de API que no era necesariamente parte de esa API. Este hilo tiene muchas respuestas buenas y completas, por lo que no ampliaré aún más la definición.
Sin embargo, creo que puedo agregar un buen ejemplo, que es el Javascript ES5 Shim ( https://github.com/es-shims/es5-shim ):
Javascript ha evolucionado mucho durante los últimos años, y entre muchos otros cambios en la especificación del lenguaje, se han agregado muchos métodos nuevos a sus objetos centrales.
Por ejemplo, en la especificación ES2015 (también conocida como ES5), se ha agregado el método find
al prototipo de Array
. Entonces, digamos que está ejecutando su código usando un motor JavasScript anterior a esta especificación (por ejemplo: Nodo 0.12) que aún no ofrece ese método. Al cargar el calce ES5, estos nuevos métodos se agregarán al prototipo Array
, lo que le permitirá utilizarlos incluso si no está ejecutando una nueva especificación JavaScript.
Podría preguntar: ¿por qué alguien haría eso en lugar de actualizar el entorno a una versión más nueva (digamos el Nodo 8)?
Hay muchos escenarios de casos reales donde ese enfoque tiene sentido. Un buen ejemplo:
Supongamos que tiene un sistema heredado que se ejecuta en un entorno antiguo y necesita utilizar métodos nuevos para implementar / corregir una funcionalidad. La actualización de su entorno todavía es un trabajo en progreso porque existen problemas de compatibilidad que requieren una gran cantidad de cambios de código y pruebas (un componente crítico).
En este ejemplo, podría tratar de crear su propia versión de dicha funcionalidad, pero eso haría que su código sea más difícil de leer, más complejo, puede introducir nuevos errores y requerirá toneladas de pruebas adicionales solo para cubrir una funcionalidad que usted sabe que lo hará. estar disponible en la próxima versión.
En su lugar, puede usar esta corrección y hacer uso de estos nuevos métodos, aprovechando el hecho de que esta corrección / funcionalidad será compatible después de la actualización, porque ya está utilizando los métodos que están disponibles en la próxima especificación. Y hay una razón adicional: dado que estos métodos son nativos de la siguiente especificación de idioma, hay muchas posibilidades de que se ejecuten más rápido que cualquier implementación que podría haber hecho si hubiera intentado crear su propia versión.
Otro escenario real donde tal enfoque es bienvenido es a nivel del navegador. Supongamos que necesita admitir un navegador antiguo y desea aprovechar estas funciones más recientes. Javascript es un lenguaje que le permite agregar / modificar métodos en sus objetos centrales (como agregar métodos al prototipo de Array), y esas bibliotecas de shim son lo suficientemente inteligentes como para agregar dichos métodos solo si la implementación actual no los tiene.
PD: 1) Verá el término "Polyfill" relacionado con estas cuñas Javascript. Polyfill es un tipo más especializado de shim que se utiliza para proporcionar compatibilidad directa en diferentes especificaciones de nivel de navegador. Por cierto, mi ejemplo anterior se refiere exactamente a ese ejemplo.
2) Las cuñas no están limitadas a este ejemplo (agregando funcionalidad que estará disponible en una versión futura). Hay diferentes casos de uso que se considerarían también una cuña.
3) Si tiene curiosidad sobre cómo se implementa este polyfill específico, puede abrir las especificaciones de Javascript Array.find y desplazarse hasta el final de la página, donde encontrará una implementación canónica para este método.
¿Cuál es la definición de Shim?
De la Wikipedia:
En la programación de computadoras, un shim es una pequeña biblioteca que intercepta de forma transparente una API, modifica los parámetros aprobados, maneja la operación en sí o redirige la operación a otra parte. Los ajustes se producen normalmente cuando cambia el comportamiento de una API, lo que provoca problemas de compatibilidad para las aplicaciones antiguas que todavía dependen de la funcionalidad anterior. En estos casos, la API anterior aún puede ser soportada por una fina capa de compatibilidad sobre el código más nuevo. Las cuñas también se pueden usar para ejecutar programas en diferentes plataformas de software de las que fueron desarrollados.
En cuanto a los orígenes de la palabra, quoth widget de Apple''s Dictionary
noun
a washer or thin strip of material used to align parts,
make them fit, or reduce wear.
verb ( shimmed, shimming) [ trans. ]
wedge (something) or fill up (a space) with a shim.
ORIGIN early 18th cent.: of unknown origin
Esto parece encajar bastante bien con la forma en que los diseñadores web usan el término.
Las cuñas se utilizan en .net 4.5 Microsoft Fakes framework para aislar su aplicación de otros ensambles para pruebas unitarias . Calzas desvía las llamadas a métodos específicos para codificar lo que escribes como parte de tu prueba
Según el artículo de Microsoft "Demystifying Shims" :
Es una metáfora basada en la palabra en inglés shim, que es un término de ingeniería que se usa para describir una pieza de madera o metal que se inserta entre dos objetos para hacerlos encajar mejor. En la programación de computadoras, un shim es una pequeña biblioteca que intercepta de forma transparente una API, cambia los parámetros aprobados, maneja la operación en sí o redirige la operación a otra parte. Las cuñas también se pueden usar para ejecutar programas en diferentes plataformas de software de las que fueron desarrolladas.
Interpreto que esto significa que un shim es un término genérico para cualquier biblioteca de código que actúa como intermediario y cambia parcial o completamente el comportamiento u operación de un programa. Como un verdadero intermediario, puede afectar los datos pasados a ese programa o afectar los datos devueltos por ese programa.
El artículo usa la API de Windows como ejemplo, y encontré la siguiente oración relevante:
La aplicación generalmente no sabe que la solicitud va a una DLL shim en lugar de a Windows, y Windows no sabe que la solicitud proviene de una fuente distinta a la aplicación (porque la DLL shim es solo otra DLL dentro del proceso de la aplicación) .
Para generalizar esta cita, los dos programas que forman el "pan" del "sándwich shim" no deberían poder diferenciar entre hablar con su programa de contraparte y hablar con el shim.
¿Cuáles son algunos de los pros y los contras de usar cuñas?
Nuevamente, del artículo:
Puede arreglar aplicaciones sin acceso al código fuente, o sin cambiarlas en absoluto. Usted incurre en una cantidad mínima de gastos generales de administración adicionales ... y puede arreglar un número razonable de aplicaciones de esta manera. La desventaja es el soporte, ya que la mayoría de los proveedores no admiten aplicaciones cortadas. No puedes arreglar cada aplicación usando cuñas. La mayoría de las personas suelen considerar cuñas para aplicaciones en las que el vendedor está sin negocio, el software no es lo suficientemente estratégico como para necesitar soporte, o simplemente quieren comprar algo de tiempo.
En el contexto de esta pregunta, los términos como "proxy", "adaptador" y "fachada" tienen más sentido (al menos para mí) después de haber leído el enlace anterior.
El término "cuña", tal como se define en Wikipedia, se clasificaría técnicamente, en función de su definición, como un patrón de diseño "estructural". Los muchos tipos de patrones de diseño "Estructural" se describen claramente en los patrones de diseño de software orientado a objetos (algunos dirían de hecho) como "Patrones de diseño, elementos de software reutilizable orientado a objetos", mejor conocido como "Banda de cuatro" .
El texto "Gang of Four" describe al menos 3 patrones bien conocidos, conocidos como "Proxy", "Adapter" y "Facade", que proporcionan funcionalidad tipo "shim". En la mayoría de los campos, a menudo es el uso o la falta de uso de diferentes acrónimos para el mismo concepto de raíz que causa confusión a las personas. Usando la palabra "shim" para describir los patrones de diseño "Estructural" más específicos, "Proxy" , "Adapter" y "Facade" ciertamente son un claro ejemplo de este tipo de situación. Un "shim" es simplemente un término más general para los tipos más específicos de patrones "estructurales" "Proxy", "Adaptador", "Fachada" y posiblemente otros.