En el desarrollo de software , una abstracción con fugas es una abstracción que filtra detalles que se supone que debe abstraer. [1]
Según lo acuñado por Joel Spolsky , la Ley de abstracciones con fugas establece: [2]
Todas las abstracciones no triviales, hasta cierto punto, tienen fugas.
Esta afirmación destaca una causa particularmente problemática de los defectos del software: la dependencia del desarrollador de software en la infalibilidad de una abstracción.
El artículo de Spolsky da ejemplos de una abstracción que funciona la mayor parte del tiempo, pero donde no se puede ignorar un detalle de la complejidad subyacente, filtrando así la complejidad de la abstracción al software que usa la abstracción.
Historia
El término "abstracción con fugas" fue popularizado en 2002 por Joel Spolsky . [2] [3] Un artículo anterior de Kiczales describe algunos de los problemas con abstracciones imperfectas y presenta una posible solución al problema al permitir la personalización de la abstracción en sí. [4]
Efecto en el desarrollo de software
A medida que los sistemas se vuelven más complejos, los desarrolladores de software deben confiar en más abstracciones. Cada abstracción intenta ocultar la complejidad, permitiendo que un desarrollador escriba un software que "maneje" las muchas variaciones de la informática moderna.
Sin embargo, esta ley afirma que los desarrolladores de software confiable deben aprender los detalles subyacentes de la abstracción de todos modos.
Ejemplos de
El artículo de Spolsky cita muchos ejemplos de abstracciones con fugas que crean problemas para el desarrollo de software:
- La pila de protocolos TCP / IP es la combinación de TCP , que intenta proporcionar una entrega confiable de información, que se ejecuta sobre IP , que solo brinda un servicio de "mejor esfuerzo". Cuando IP pierde un paquete, TCP tiene que retransmitirlo, lo que lleva más tiempo. Por lo tanto, TCP proporciona la abstracción de una conexión confiable, pero los detalles de implementación se filtran en forma de rendimiento potencialmente variable (el rendimiento y la latencia sufren cuando los datos deben retransmitirse).
- La iteración sobre una gran matriz bidimensional puede tener un rendimiento radicalmente diferente si se hace horizontalmente en lugar de verticalmente, dependiendo del orden en que los elementos se almacenan en la memoria. Una dirección puede aumentar enormemente las fallas de caché y las fallas de página , las cuales retrasan enormemente el acceso a la memoria.
- El lenguaje SQL abstrae los pasos de procedimiento para consultar una base de datos , lo que le permite a uno simplemente definir lo que quiere. Pero ciertas consultas SQL son miles de veces más lentas que otras consultas lógicamente equivalentes. En un nivel aún más alto de abstracción, los sistemas ORM , que aíslan el código orientado a objetos de la implementación de la persistencia de objetos utilizando una base de datos relacional, todavía obligan al programador a pensar en términos de bases de datos, tablas y consultas SQL nativas tan pronto como el rendimiento de Las consultas generadas por ORM se convierten en una preocupación.
- Aunque los sistemas de archivos de red como NFS y SMB permiten tratar los archivos en máquinas remotas como si fueran locales, la conexión a la máquina remota puede ralentizarse o romperse, y el archivo deja de actuar como si fuera local.
- La plataforma de programación de formularios web ASP.NET , que no debe confundirse con ASP.NET MVC, abstrae la diferencia entre el código HTML para manejar hacer clic en un hipervínculo () y el código para manejar hacer clic en un botón. Sin embargo, ASP.NET necesita ocultar el hecho de que en HTML no hay forma de enviar un formulario desde un hipervínculo. Lo hace generando algunas líneas de JavaScript y adjuntando un controlador onclick al hipervínculo. Sin embargo, si el usuario final tiene JavaScript deshabilitado, la aplicación ASP.NET no funciona correctamente. Además, no se puede pensar ingenuamente en los controladores de eventos en ASP.NET de la misma manera que en un marco de interfaz gráfica de usuario de escritorio como Windows Forms ; Debido a la naturaleza asincrónica de la Web, el procesamiento de controladores de eventos en ASP.NET requiere intercambiar datos con el servidor y volver a cargar el formulario.
La interfaz de Git es otro ejemplo de abstracción con fugas, como se explica en este artículo. [5]
Ver también
Referencias
- ^ Seibel, Peter (1 de noviembre de 2006). Práctico Common Lisp . Presione. pag. 96. ISBN 978-1-4302-0017-8.
- ^ a b Spolsky, Joel (2002). "La ley de abstracciones con fugas" . Consultado el 22 de septiembre de 2010 .
- ^ arvindpdmn (23 de agosto de 2019). "Abstracciones con fugas" . Devopedia . Consultado el 7 de julio de 2020 .
- ^ Kiczales, Gregor (1992). "Hacia un nuevo modelo de abstracción en la ingeniería de software" (PDF) . Archivado desde el original (PDF) el 4 de junio de 2011 . Consultado el 3 de febrero de 2010 .
- ^ "Control de versiones (Git)" . el semestre faltante de su educación cs . Consultado el 31 de julio de 2020 .