¿Cuál es la definición de una cuña?
terminology
definition
vocabulary
shim
Nanook
fuente
fuente
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.
fuente
Explicación simple a través de dibujos animados
Un ejemplo de una cuña:
Resumen
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.
fuente
En cuanto a los orígenes de la palabra, quoth widget del Diccionario de Apple
Esto parece encajar bastante bien con cómo los diseñadores web usan el término.
fuente
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
fuente
Según el artículo de Microsoft "Desmitificando cuñas" :
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:
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:
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.
fuente
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 alArray
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 alArray
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.
fuente
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).
fuente