En programación de computadoras , la inversión de abstracción es un antipatrón que surge cuando los usuarios de una construcción necesitan funciones implementadas dentro de ella pero no expuestas por su interfaz . El resultado es que los usuarios vuelven a implementar las funciones requeridas en términos de la interfaz, que a su vez utiliza la implementación interna de las mismas funciones. Esto puede resultar en la implementación de características de nivel inferior en términos de otras de nivel superior, de ahí el término "inversión de abstracción".
Los posibles efectos nocivos son:
- El usuario de una función reimplementada de este tipo puede subestimar seriamente sus costos de funcionamiento.
- El usuario de la construcción se ve obligado a ocultar su implementación con complejos detalles mecánicos.
- Muchos usuarios intentan solucionar el mismo problema, aumentando el riesgo de error.
Ejemplos
Los supuestos ejemplos de círculos de programación profesionales incluyen:
- En Ada , la elección de la construcción de encuentro como primitiva de sincronización obligó a los programadores a implementar construcciones más simples, como semáforos, sobre una base más compleja. [1]
- En Applesoft BASIC , la aritmética de enteros se implementó sobre la aritmética de punto flotante , y no había operadores bit a bit ni soporte para blitting de gráficos rasterizados (aunque el lenguaje admitía gráficos vectoriales en el hardware rasterizado de Apple II). Esto provocó que los juegos y otros programas escritos en BASIC se ejecutaran más lento.
- Al igual que Applesoft BASIC, Lua tiene un tipo de punto flotante como único tipo numérico [2] cuando se configura para computadoras de escritorio, [3] y no tenía operadores bit a bit antes de Lua 5.2. [4]
- Crear un objeto para representar una función es engorroso en lenguajes orientados a objetos como Java y C++ (especialmente antes de C++ 11 y Java 8), en los que las funciones no son objetos de primera clase . En C++ es posible hacer que un objeto sea 'invocable' sobrecargando el
()
operador, pero a menudo aún es necesario implementar una nueva clase, como los Functors en STL . ( La función lambda de C++11 hace que sea mucho más fácil crear un objeto que represente una función). - Tom Lord ha sugerido que el sistema de control de versiones Subversion paga por la inversión de abstracción de implementar una base de datos de sólo escritura en una base de datos de lectura/escritura con bajo rendimiento. [5]
- El uso de procedimientos almacenados para manipular datos en una base de datos relacional, sin otorgar a los programadores el derecho de implementar dichos procedimientos, lleva a reimplementar consultas fuera de la base de datos. Por ejemplo, se recuperan grandes conjuntos de datos (en casos extremos, tablas completas) y se realiza el filtrado real en el código de la aplicación. Alternativamente, se actualizan (insertan o incluso recuperan) miles de filas una por una en lugar de ejecutar una consulta de varias filas.
- WinUI 3 de Microsoft reemplaza sistemáticamente la barra de título de las ventanas que crea con una personalizada que ignora la configuración de color del usuario final y siempre aparece en gris. Aplicar el color elegido por el usuario final a la barra de título requiere usar código de personalización adicional en Windows 11 y reemplazar completamente la barra de título personalizada por otra personalizada en Windows 10. [6]
Los ejemplos que son comunes fuera de los círculos de programación profesional incluyen:
- Usar funciones de búsqueda de hojas de cálculo para replicar la funcionalidad de una base de datos
- Usar tipos de datos variantes como contadores de bucles en Microsoft Visual Basic donde también está disponible un tipo entero.
Ver también
Referencias
- ^ Crítica de la definición DIN Kernel Lisp Versión 1.2, nota al pie 2 Archivado el 6 de mayo de 2018 en Wayback Machine : dice (sin referencias) que el término deriva de críticas al encuentro de Ada y parece ser uno de los primeros usos.
- ^ Programación en Lua: 2.3 - Números consultados el 12 de octubre de 2009.
- ^ lua-users c2: coma flotante Consultado el 12 de octubre de 2009.
- ^ lua-users c2: Operadores bit a bit Consultado el 15 de enero de 2013.
- ^ sourcefrog: Tom Lord sobre Subversion
- ^ Personalización de la barra de título: aplicaciones de Windows | Microsoft aprende
enlaces externos
- Inversión de abstracción en Portland Pattern Repository: discusión extensa, en gran parte sobre "inversión de abstracción" en el sentido de "complejidad oculta"