¿Qué significa el término "Leaky Abstraction"? (Por favor, explique con ejemplos. A menudo me cuesta entender una mera teoría.)Significado de la abstracción de fuga?
Respuesta
Simplemente significa que su abstracción expone algunos de los detalles de la implementación, o que debe conocer los detalles de la implementación al usar la abstracción . El término se atribuye a Joel Spolsky, alrededor de 2002. Consulte la wikipedia article para obtener más información.
Un ejemplo clásico son las bibliotecas de red que le permiten tratar archivos remotos como locales. El desarrollador que usa esta abstracción debe ser consciente de que los problemas de red pueden hacer que esto falle de forma que los archivos locales no lo hacen. Luego necesita desarrollar código para manejar específicamente los errores fuera de la abstracción que proporciona la biblioteca de red.
@mehaase No veo cómo importa si su abstracción es filtrada por diseño o por negligencia. He ampliado la respuesta con un ejemplo y más información del artículo al que se hace referencia para que pueda funcionar por sí misma. Además, no creo que la "abstracción con fugas" necesariamente deba ser peyorativa. Para mí, simplemente describe una situación en la que, como desarrollador, debe ser más cuidadoso al trabajar con la abstracción. El diseño puede ser bueno, malo o indiferente independientemente de la "fuga". – tvanfosson
Wikipedia tiene un pretty good definition para este
Una abstracción con fugas se refiere a cualquier abstracción implementado, destinado a reducir (u ocultar) la complejidad, donde los detalles subyacentes no están completamente ocultos
O en en otras palabras, para el software es cuando puede observar los detalles de implementación de una función a través de limitaciones o efectos secundarios en el programa.
Un ejemplo rápido serían los cierres C#/VB.Net y su incapacidad para capturar los parámetros de ref/out. La razón por la que no se pueden capturar se debe a un detalle de implementación de cómo se produce el proceso de elevación. Esto no significa que haya una mejor manera de hacerlo.
Bueno, en cierto modo es una cuestión puramente teórica, aunque no sin importancia.
Utilizamos abstracciones para que las cosas sean más fáciles de comprender. Puedo operar en una clase de cadena en algún idioma para ocultar el hecho de que estoy tratando con un conjunto ordenado de caracteres que son elementos individuales. Trato con un conjunto ordenado de personajes para ocultar el hecho de que estoy lidiando con números. Me ocupo de los números para ocultar el hecho de que estoy lidiando con 1s y 0s.
Una abstracción con goteras es aquella que no oculta los detalles que pretende esconder. Si call string.Length en una cadena de 5 caracteres en Java o .NET podría obtener cualquier respuesta del 5 al 10, debido a los detalles de implementación donde lo que esos idiomas llaman caracteres son realmente puntos de datos UTF-16 que pueden representar 1 o .5 de un personaje. La abstracción se ha filtrado. Sin embargo, no filtrar significa que encontrar la longitud requeriría más espacio de almacenamiento (para almacenar la longitud real) o pasaría de ser O (1) a O (n) (para calcular cuál es la longitud real). Si me importa la respuesta real (a menudo no lo hace realmente), necesita trabajar en el conocimiento de lo que realmente está sucediendo.
Casos más debatibles que suceden con casos en los que un método o propiedad permite acceder al funcionamiento interno, ya sean filtraciones de abstracción o formas bien definidas de pasar a un nivel inferior de abstracción, a veces puede ser una cuestión la gente no está de acuerdo.
Y trabajas con 1 y 0 para ocultar el hecho de que estás trabajando con electrónica y física (comentario muy tardío, lo sé) – Davy8
Un ejemplo en el django ORM many-to-many example:
Aviso en el Ejemplo de uso de la API que es necesario .save() la base del artículo objeto a1 antes de agregar objetos publicación para el atributo de muchos a muchos. Y observe que la actualización de los atributos guarda muchos a muchos en la base de datos subyacente inmediatamente, mientras que la actualización de un atributo singular no se refleja en el db hasta que se llame a .save().
La abstracción es que estamos trabajando con un gráfico de objetos, donde los atributos de valor único y los atributos multivalor son solo atributos. Pero la implementación como un almacén de datos respaldado por una base de datos relacional se filtra ... a medida que el sistema de integridad del RDBS aparece a través de la fina capa de una interfaz de objeto.
He aquí un ejemplo familiar para los desarrolladores .NET: la clase Page
de ASP.NET intenta ocultar los detalles de las operaciones HTTP, particularmente la gestión de los datos del formulario, para que los desarrolladores no tengan que lidiar con los valores publicados los mapas forman valores a los controles del servidor).
Pero si va más allá de los escenarios de uso más básicos, la abstracción Page
comienza a filtrarse y se vuelve difícil trabajar con páginas a menos que comprenda los detalles de implementación de la clase.
Un ejemplo común es la adición de controles dinámicamente a una página - el valor de controles agregados dinámicamente, no se asignará para usted a menos que se agregan al el momento justo: antes de que el motor subyacente mapea los valores del formulario de entrada a los controles apropiados. Cuando tenga que aprender eso, la abstracción tiene filtrado.
Continuaré en la línea de dar ejemplos mediante el uso de RPC.
En el mundo ideal de RPC, una llamada a procedimiento remoto debe parecerse a una llamada de procedimiento local (o eso dice la historia). Debería ser completamente transparente para el programador de modo que cuando llame al SomeObject.someFunction()
no tenga idea si SomeObject
(o solo someFunction
para el caso) se almacenan localmente y se ejecutan o almacenan y ejecutan remotamente. La teoría dice que esto hace que la programación sea más simple.
La realidad es diferente porque hay una gran diferencia entre hacer una llamada a la función local (incluso si usted está usando un lenguaje interpretado lento del mundo) y:
- llamando a través de un objeto proxy
- serialización de su parámetros
- hacer una conexión de red (si no está ya establecida)
- transmitir los datos al proxy remoto
- tener el proxy remoto restaurar los datos y llamar a la función de control remoto en su nombre
- serializar el valor (s) de retorno
- la transmisión de los valores de retorno al proxy local
- volver a montar los datos serializados
- devolver la respuesta de la función remota
Con el tiempo solo eso es aproximadamente tres órdenes (o más) de diferencia de magnitud. Esos tres + órdenes de magnitud van a hacer una gran diferencia en el rendimiento que hará que la abstracción de una fuga de llamada de procedimiento, obviamente, sea la primera vez que trata erróneamente un RPC como una llamada a función real. Además, una llamada de función real, salvo problemas graves en su código, tendrá muy pocos puntos de falla fuera de los errores de implementación.Una llamada RPC tiene todos los siguientes problemas posibles que conseguirá untado en los casos de insuficiencia como por encima de lo que cabría esperar de una llamada local normal:
- que podría no ser capaz de crear instancias de su proxy local
- que podría no ser capaz de crear instancias de su proxy remoto
- los proxies pueden no ser capaces de conectarse
- los parámetros que envíe no puede hacer que sea intacto o en absoluto valor
- el retorno del control remoto envía no puede hacerlo intacto o nada
Así que ahora su llamada RPC que es "como una llamada de función local" tiene toda una carga de condiciones de falla adicionales que no tiene que lidiar cuando hace llamadas a funciones locales. La abstracción se ha filtrado nuevamente, aún más difícil.
Al final, RPC es una mala abstracción porque se filtra como un colador en todos los niveles, cuando tiene éxito y falla.
Bueno, esta es la única respuesta que realmente da un buen ejemplo (comprensión de lectura, amigos), por lo que obtiene mi +1. –
Aquí está un ejemplo meatspace:
Automóviles tienen abstracciones para los conductores. En su forma más pura, hay un volante, acelerador y freno. Esta abstracción esconde muchos detalles sobre lo que hay debajo del capó: motor, levas, correa dentada, bujías, radiador, etc.
Lo bueno de esta abstracción es que podemos reemplazar partes de la implementación con partes mejoradas sin Reentrenamiento del usuario. Digamos que reemplazamos la tapa del distribuidor con encendido electrónico y reemplazamos la cámara fija con una cámara variable. Estos cambios mejoran el rendimiento, pero el usuario todavía maneja la rueda y usa los pedales para comenzar y detenerse.
En realidad es bastante notable ... ¡un niño de 16 años o de 80 años puede manejar esta complicada máquina sin saber mucho sobre cómo funciona en su interior!
Pero hay goteras. La transmisión es una pequeña fuga. En una transmisión automática puede sentir que el automóvil pierde potencia por un momento cuando cambia de marcha, mientras que en CVT siente un par suave hacia arriba.
También hay fugas más grandes. Si acelera el motor demasiado rápido, puede dañarlo. Si el bloque del motor está demasiado frío, es posible que el automóvil no arranque o que tenga un bajo rendimiento. Y si enciende la radio, los faros y la corriente alterna todo al mismo tiempo, verá que su consumo de combustible disminuye.
Gracias por el ejemplo. Nadie más parecía ser capaz de proporcionar una explicación simple. –
Esta es una gran respuesta, sobre todo porque demuestra el punto de vista del usuario, que es de lo que se trata la versión del software. – chad
Supongamos, tenemos el siguiente código en una biblioteca:
Object[] fetchDeviceColorAndModel(String serialNumberOfDevice)
{
//fetch Device Color and Device Model from DB.
//create new Object[] and set 0th field with color and 1st field with model value.
}
Cuando el consumidor llama a la API, que reciben un Object []. El consumidor debe comprender que el primer campo de la matriz de objetos tiene un valor de color y el segundo campo es el valor de modelo. Aquí la abstracción se ha filtrado de la biblioteca al código del consumidor.
Una de las soluciones es devolver un objeto que encapsula el modelo y el color del dispositivo. El consumidor puede llamar a ese objeto para obtener el valor del modelo y el color.
DeviceColorAndModel fetchDeviceColorAndModel(String serialNumberOfTheDevice)
{
//fetch Device Color and Device Model from DB.
return new DeviceColorAndModel(color, model);
}
- 1. Explicación de presentación-abstracción-control
- 2. Abstracción de la composición de la mónada como un transformador
- 3. La mejor definición de fuga de memoria
- 4. ¿Funciona alrededor de la fuga de SpellCheckerSession?
- 5. abstracción vs clase abstracta
- 6. Scala abstracción constructor
- 7. ¿Cuánta abstracción es demasiado?
- 8. DynamoDB Perl Abstracción
- 9. Fuga de memoria IE9
- 10. ¿Una fuga de memoria de la aplicación causa una fuga de memoria en el sistema operativo?
- 11. Fuga de ClassLoader - ¿Valen la pena resolverlo?
- 12. Significado de la declaración de la función
- 13. Fuga de memoria de suplantación
- 14. Evitando la violación del Principio de abstracción reutilizada
- 15. ¿Es este un uso excesivo de la abstracción?
- 16. ¿La interfaz tiene el mayor nivel de abstracción?
- 17. ¿Qué es la abstracción frente al gráfico de inestabilidad?
- 18. NoSQL capa de abstracción para Python
- 19. Abstracción vs encapsulación en Java
- 20. ¿Cuál es la diferencia entre la abstracción y la encapsulación?
- 21. Fuga de memoria con ContextMenuStrip
- 22. Fuga de memoria no administrada
- 23. Fuga de memoria en C++
- 24. Significado de la estructura de pijamas
- 25. Significado de! en la sintaxis de Java
- 26. Fuga de memoria en Swing
- 27. Fuga de memoria para CComBSTR
- 28. Significado de la palabra clave 'privada' en Alloy? Significado de la declaración 'enum'?
- 29. significado de código de importación de bytes significado
- 30. Fuga de memoria con la recolección de basura de Cocoa
posible duplicado de [interfaces fluidas y abstracciones con fugas] (http://stackoverflow.com/questions/433450/fluent-interfaces-and-leaky-abstractions) – missingfaktor
Es posible que desee leer originales de Joel Spolsky artículo [ La Ley de las Extracciones Leaky] (http: // www.joelonsoftware.com/articles/LeakyAbstractions.html) que, por lo que sé, es el origen del término. –
La mayoría de las respuestas del engañado propuesto se refieren a interfaces fluidas. –