Respuestas:
De Wikipedia:
En la programación de computadoras, un shim es una pequeña biblioteca que intercepta de manera transparente una API, cambiando los parámetros pasados, manejando la operación en sí misma o redirigiendo la operación a otra parte. Las cuñas generalmente se producen cuando cambia el comportamiento de una API, lo que causa problemas de compatibilidad para aplicaciones más antiguas que aún dependen de la funcionalidad más antigua. En estos casos, la API más antigua aún puede ser compatible con una capa de compatibilidad delgada sobre el código más nuevo. Las cuñas también se pueden usar para ejecutar programas en diferentes plataformas de software para las que fueron desarrolladas.
El término "cuña", tal como se define en Wikipedia, técnicamente se clasificaría, según su definición, como un patrón de diseño "estructural". Los muchos tipos de patrones de diseño "estructurales" se describen con bastante claridad en la referencia de patrones de diseño de software orientado a objetos (algunos dirían de facto) "Patrones de diseño, elementos de software orientado a objetos reutilizables", mejor conocida como la "Banda de los cuatro" .
El texto "Gang of Four" describe al menos 3 patrones bien establecidos conocidos como "Proxy", "Adaptador" y "Fachada", todos los cuales proporcionan funcionalidad de tipo "shim". En la mayoría de los campos, a menudo es el uso y / o falta el uso de diferentes siglas para el mismo concepto raíz que causa confusión a las personas. El uso de la palabra "shim" para describir los patrones de diseño "Estructural" más específicos " Proxy" , "Adaptador" y "Fachada" ciertamente es un claro ejemplo de este tipo de situación. Un "calce" es simplemente un término más general para los tipos más específicos de patrones "estructurales" "Proxy", "Adaptador", "Fachada" y posiblemente otros.
Un ejemplo de una cuña:
Nota: la analogía es tensa. Por lo general, Ralph obtendrá EXACTAMENTE lo que pidió, pero la mecánica de CÓMO se obtuvo es algo que podría no esperar.
Una cuña es un código que se encarga de lo que se pide (por 'intercepción'), sin que nadie sea más sabio al respecto. Este es el concepto general. Ahora debería poder leer y comprender la entrada de wikipedia sobre cuñas.
En cuanto a los orígenes de la palabra, quoth widget del Diccionario de Apple
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 cómo los diseñadores web usan el término.
Las cuñas se usan en .net 4.5 Microsoft Fakes framework para aislar su aplicación de otros ensamblados para pruebas unitarias . Las cuñas desvían las llamadas a métodos específicos para codificar que usted escribe como parte de su prueba
Según el artículo de Microsoft "Desmitificando cuñas" :
Es una metáfora basada en la palabra inglesa shim, que es un término de ingeniería utilizado para describir una pieza de madera o metal que se inserta entre dos objetos para que encajen mejor. En la programación de computadoras, un shim es una pequeña biblioteca que intercepta de manera transparente una API, cambia los parámetros pasados, maneja la operación en sí misma o la redirige a otra parte. Las cuñas también se pueden usar para ejecutar programas en diferentes plataformas de software para 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. Al igual que 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é relevante la siguiente oración:
Por lo general, la aplicación desconoce que la solicitud se dirigirá a una DLL shim en lugar de a la propia Windows, y Windows no sabe que la solicitud proviene de una fuente distinta de 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 hacen el "pan" del "sándwich de cuña" no deberían poder diferenciar entre hablar con su programa de contraparte y hablar con la cuña.
¿Cuáles son algunas de las ventajas y desventajas de usar cuñas?
De nuevo, 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 sobrecarga administrativa adicional ... 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 simuladas. No puede arreglar todas las aplicaciones con cuñas. La mayoría de las personas generalmente consideran calzas para aplicaciones en las que el proveedor está fuera del 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, términos como "proxy", "adaptador" y "fachada" tienen más sentido (al menos para mí) después de haber leído el enlace anterior.
Como pudimos ver en muchas respuestas aquí, una cuña es una especie de adaptador que proporciona funcionalidad a nivel API que no era necesariamente parte de esa API. Este hilo tiene muchas respuestas buenas y completas, por lo que no estoy ampliando la definición más.
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 principales.
Por ejemplo, en la especificación ES2015 (también conocido como ES5), el método find
se ha agregado al Array
prototipo. Entonces, supongamos que está ejecutando su código utilizando un motor JavasScript antes de esta especificación (ej .: Nodo 0.12) que aún no ofrece ese método. Al cargar la cuña ES5, estos nuevos métodos se agregarán al Array
prototipo, lo que le permitirá utilizarlos incluso si no está ejecutando una especificación JavaScript más nueva.
Puede preguntar: ¿por qué alguien haría eso en lugar de actualizar el entorno a una versión más nueva (digamos Nodo 8)?
Hay muchos escenarios de casos reales en los que ese enfoque tiene sentido. Un buen ejemplo:
Supongamos que tiene un sistema heredado que se ejecuta en un entorno antiguo y que necesita utilizar estos nuevos métodos para implementar / corregir una funcionalidad. La actualización de su entorno sigue siendo un trabajo en progreso porque hay problemas de compatibilidad que requieren muchos cambios y pruebas de código (un componente crítico).
En este ejemplo, podría intentar 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 sabe que será estará disponible en la próxima versión.
En su lugar, puede usar esta cuña y hacer uso de estos nuevos métodos, aprovechando el hecho de que esta solución / funcionalidad será compatible después de la actualización, ya que ya está utilizando los métodos conocidos por estar disponibles en la siguiente especificación. Y hay una razón adicional: dado que estos métodos son nativos de la siguiente especificación de idioma, existe una buena posibilidad de que se ejecuten más rápido que cualquier implementación que podría haber hecho si intentara hacer su propia versión.
Otro escenario real donde este enfoque es bienvenido es a nivel del navegador. Supongamos que necesita admitir el navegador antiguo y desea aprovechar estas nuevas funciones. Javascript es un lenguaje que le permite agregar / modificar métodos en sus objetos principales (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 carece de ellos.
PD: 1) Verá el término "Polyfill" relacionado con estas cuñas de Javascript. Polyfill es un tipo de shim más especializado que se utiliza para proporcionar compatibilidad con versiones posteriores en diferentes especificaciones de nivel de navegador. Por cierto, mi ejemplo anterior se refiere exactamente a ese ejemplo.
2) Las cuñas no se limitan a este ejemplo (agregando funcionalidad que estará disponible en una versión futura). Existen diferentes casos de uso que también se considerarían una cuña.
3) Si tiene curiosidad acerca de cómo se implementa este polyfill específico, puede abrir las especificaciones Javascript Array.find y desplazarse hasta el final de la página donde encontrará una implementación canónica para este método.
SHIM es otro nivel de verificación de seguridad que se realiza para todos los servicios, para proteger los sistemas ascendentes. El servidor SHIM valida cada solicitud entrante, con credenciales de usuario de encabezado, contra las credenciales de usuario, que se pasan en la solicitud (SOAP / RESTFUL).