No estoy seguro si ambos términos se pueden usar indistintamente. ¿Quizás haya alguna distinción académica en informática que no sea relevante para la programación diaria? ¿O puedo usar ambos términos indistintamente sin estar equivocado? ¿Quizás depende del contexto en el que uso ambos términos?
Editar: en razón por la que encuentro que ambos términos son posiblemente intercambiables es una entrada de Wikipedia sobre la capa de abstracción . Allí puede encontrar la cita de David Wheelers 'Todos los problemas en informática pueden resolverse con otro nivel de indirección'.
computer-science
terminology
Theo Lenndorff
fuente
fuente
Respuestas:
La abstracción se ocupa de la simplificación, la indirección se ocupa de la ubicación.
Abstracciónes un mecanismo que "oculta" detalles complicados de un objeto en términos de términos más simples y fáciles de manipular. En programación, un buen ejemplo es la diferencia de detalles entre el código de máquina y las diversas herramientas para crear aplicaciones que se basan en última instancia en el código de máquina. Considere crear una aplicación de Windows Form con el IDE de Visual Studio. El IDE le permite pensar en la aplicación en términos de elementos fáciles de manipular de una manera "Lo que ves es lo que obtienes". La posición de un widget de pantalla se abstrae en una ubicación visual en un marco que puede cambiar arrastrando el widget. Internamente, el IDE manipula el widget utilizando otra capa de abstracción, como un lenguaje de alto nivel (como C #). C # en sí no se manipula utilizando código de máquina, se manipula utilizando un "entorno de tiempo de ejecución común"
Indirección se refiere a hacer que la ubicación de un artículo sea transparente. Si conoce el URI de un recurso web, puede acceder al recurso sin conocer su ubicación precisa. No accede al recurso directamente, sino que accede a través de un canal que pasa su solicitud a través de una serie de servidores, aplicaciones y enrutadores. La indirecta se puede considerar como un tipo especial de abstracción donde se abstrae la ubicación.
fuente
Las abstracciones se implementan mediante indirección.
Por ejemplo, memoria virtual: la abstracción es un espacio de direcciones contiguas totalmente a su disposición. Esta abstracción se implementa utilizando la indirección a través de una tabla de páginas. En lugar de acceder directamente a las direcciones de memoria física, se traducen de una dirección virtual a una dirección física.
Para agregar una capa de abstracción, debe agregar una capa de indirección. Pero agregar indirección no necesariamente te da una abstracción. Por ejemplo, tener captadores y definidores en cada variable individual es una capa de indirección, pero si todo lo que hacen es obtener y establecer valores simples, no hay abstracción.
fuente
Primero, intentemos definiciones apropiadas para los términos:
Capa de abstracción significa:
Nivel de indirección por otro lado significa:
Ambas cosas pueden significar lo mismo, siempre que use:
fuente
Entiendo que la abstracción se refiere principalmente a funciones y la indirección se refiere principalmente a datos. En otras palabras, el nivel de abstracción es qué tan profundo es el seguimiento de su pila, y el nivel de indirección es cuántos punteros debe desreferenciar. Al menos así es como uso los términos.
fuente
La capa de abstracción y el nivel de indirección son conceptos distintos. La abstracción es la agregación y la designación significativa de una serie de elementos, como datos o instrucciones del programa, por ejemplo, el concepto de una llamada a un archivo o método, mientras que la indirección es el desacoplamiento de entidades para facilitar el aplazamiento de la realización de su relación, por ejemplo, el uso de JNDI para separar la identificación de un recurso dentro de un programa del recurso real que eventualmente puede proporcionar un contenedor de aplicaciones.
Con frecuencia, los conceptos van de la mano y cuál se aplica a una construcción particular depende de qué ejercicio o discusión esté en progreso. Por ejemplo, la naturaleza abstracta de una interfaz es importante al aprender o documentar una API; su propiedad de indirección es importante al agregar extensibilidad o crear pruebas para una aplicación.
Una capa de abstracción es la agregación de abstracciones y darles una integridad conceptual y consistencia de uso. CreateProcess es el nombre de la API win32 para un montón de código que crea y ejecuta un proceso. El "nombre" es significativo para este contexto porque si llamamos a la función algo así como DoAllocMemThenMakeEnvThenFindEntryPoint ... realmente no sería muy abstracto. Una capa como la API Win32 proporciona una barrera a través de la cual se puede aconsejar a un programador que no se aventure. Elimina la complejidad desde el punto de vista de la persona que llama a costa de una potencia reducida (flexibilidad, rendimiento, etc.). Esta compensación se destaca por la discusión frecuente de abstracciones con fugas: es posible que aún necesitemos hacer llamadas SQL directas cuando usamos Hibernate o hacer llamadas Win32 cuando usamos .NET.
Con respecto a la indirección, la mayoría de los programas no triviales operan con alguna forma de indirección codificada por el usuario, testigo de la sección ENTRADA-SALIDA de COBOL antes del arca. Al acceder a un recurso, como una base de datos, podemos ver la incrustación de una cadena de conexión JDBC en el código como indirección de Nivel 0, una conexión JNDI (que delega la elección del recurso a un contenedor de aplicaciones) como Nivel 1 y alguna construcción Spring que se asigna el identificador JNDI de la aplicación a uno de los muchos recursos del contenedor como Nivel 2. Varios niveles permiten que varias partes externas a la relación (en este caso, una relación entre el código de ejecución y una base de datos) manipulen esa relación. Esto se aplica igualmente a los componentes internos del programa, como las interfaces y los eventos.
Vemos que, no importa cuáles sean sus otras cualidades, la abstracción reduce la complejidad, mientras que la indirección la aumenta. La abstracción reduce el poder, mientras que la indirección lo aumenta. La indirecta se puede utilizar para restaurar el poder de la abstracción al permitir que las devoluciones de llamada personalizadas anulen el comportamiento predeterminado.
fuente
Un puntero a un puntero a un puntero a un puntero a un puntero a un puntero a int tiene seis niveles de indirección, pero ninguna capa de abstracción.
fuente
Un buen ejemplo de abstracción es llamar a un único método para almacenar un elemento en una base de datos. El método abstrae los detalles de conexión y llamada a la base de datos. Donde un ejemplo de indirección es usar una estructura para acceder a las interrupciones. Todavía está accediendo a la interrupción cuando establece valores en la estructura. es solo indirectamente a través de la estructura dando nombres de miembros de estructura a puntos específicos en la memoria.
Por lo tanto, la abstracción oculta detalles de la implementación donde la indirección simplemente proporciona una interfaz "indirecta" a través de la cual acceder a algo.
La abstracción es cuando no necesitas entender lo que está oculto, donde con la indirecta lo haces.
fuente
Agregar un nivel (o capa) de abstracción y agregar un nivel de indirección son simplemente dos formas de decir lo mismo. Cuando resuelve un problema, generalmente intenta una solución directa. A veces eso no es posible, así que intentas una solución indirecta. Esto requiere introducir alguna abstracción para simplificar el problema, ya que es porque el problema es complejo y no se puede resolver directamente. Habiendo resuelto el problema mediante el enfoque indirecto, no hay razón para no considerar resolver el problema nuevamente, sino de manera más general; Esto implicará la introducción de otro nivel más alto de abstracción. Y esta nueva solución más general es aún más indirecta que la solución indirecta original, es decir, se ha introducido otro nivel de indirección.
fuente