En programación de computadoras , la inversión de abstracción es un anti-patrón que surge cuando los usuarios de un constructo necesitan funciones implementadas dentro de él 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 características 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 costes de funcionamiento.
- El usuario de la construcción se ve obligado a ocultar su implementación con complejos detalles mecánicos.
- Muchos usuarios intentan resolver el mismo problema, aumentando el riesgo de error.
Ejemplos de
Los supuestos ejemplos de los círculos de programación profesional 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ó además de 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 raster de Apple II). Esto provocó que los juegos y otros programas escritos en BASIC se ejecutaran más lentamente.
- 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 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 de Subversion paga por la inversión de abstracción de implementar una base de datos de solo 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 a implementar dichos procedimientos, conduce a volver a implementar consultas fuera de la base de datos. Por ejemplo, se obtienen grandes conjuntos de datos (en casos extremos, tablas completas) y se realiza un filtrado real en el código de la aplicación. Alternativamente, miles de filas se actualizan (insertadas o incluso recuperadas) una por una en lugar de ejecutar una consulta de varias filas.
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
- Uso de tipos de datos variantes como contadores de bucle en Microsoft Visual Basic, donde también está disponible un tipo entero.
Ver también
Referencias
- ↑ Critique of DIN Kernel Lisp Definition Version 1.2, footnote 2 Archivado 2018-05-06 en Wayback Machine - dice (sin referencias) que el término deriva de críticas a la cita de Ada, 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: punto flotante accedido el 12 de octubre de 2009.
- ^ lua-users c2: Operadores bit a bit accedido el 15 de enero de 2013.
- ^ sourcefrog: Tom Lord en Subversion
enlaces externos
- Inversión de abstracción en Portland Pattern Repository: discusión extensa, gran parte de la cual toma "inversión de abstracción" en el sentido de "complejidad oculta"