¿Cuál es la diferencia entre 'capa de abstracción' y 'nivel de indirección'?

38

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'.

Theo Lenndorff
fuente
77
... excepto el problema de demasiados niveles de indirección!
Mason Wheeler
@MasonWheeler: Podría agregar otro nivel menos indirecto de indirección ...
Jon Purdy
C ++ le permite agregar una capa de abstracción sin una capa de indirección, por lo que no pueden significar lo mismo.
fredoverflow 01 de

Respuestas:

30

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.

Jay Elston
fuente
2
¡+1 mejor respuesta hasta ahora! Estaba a punto de escribir uno, pero este está lo suficientemente cerca de lo que tenía en mente.
Newtopian
27

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.

Austin
fuente
2
De hecho, el último ejemplo no es muy bueno. Los captadores y establecedores simples añaden abstracción. El único que sabe, son claros, es la clase que los declara. Si decide cambiar la implementación, cualquier código creado contra la abstracción no se ve afectado.
back2dos
¿Puedes dar un mejor ejemplo que sea indirección pero no abstracción?
Mr Coder
1
definitivamente un mal ejemplo
Morg.
3
¿Quién dijo algo sobre las clases? Tampoco dije nada sobre cambiar la visibilidad de una variable. Nada te impide acceder a él directamente; Es una variable. Pero también puede hacerlo con un nivel de indirección a través del getter y setter. Dado que la semántica de usar getter y setter es la misma que acceder a la variable directamente, no hay abstracción.
Austin
2
Excepto que getter y setter no necesariamente 'solo' acceden a la variable. Si está utilizando un captador y un definidor, está agregando una abstracción, ya que podría cambiarla para usar una variable diferente sin que el usuario lo sepa, por lo tanto, una abstracción.
Dominique McDonnell
9

Primero, intentemos definiciones apropiadas para los términos:

  1. Capa de abstracción significa:

     a) there is large number of positions which use abstraction
          (layer = all the positions together)
     b) each position is hiding some complex stuff, but allows invoking it 
          using only simple code. 
         (abstraction == one-to-one mapping between simple code and complex code)
    
  2. Nivel de indirección por otro lado significa:

      a) you're counting levels
      b) indirection==there are several steps before you can reach or access the data
      c) level of indirection is just how many steps it takes to access the data
    

Ambas cosas pueden significar lo mismo, siempre que use:

  a) step = going from simple code to complex code. 
tp1
fuente
7

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.

Karl Bielefeldt
fuente
con funciones virtuales modeladas como punteros a funciones?
Caleth
7

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.

mikemay
fuente
1

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.

gnasher729
fuente
0

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.

Charles Lambert
fuente
-1

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.

ChrisC
fuente
3
Esto no parece agregar nada sustancial sobre los puntos hechos y explicados en las respuestas anteriores 7
mosquito
Gracias Gnat. Entiendo tu punto, y es una pena que esta interesante pregunta atraiga mucho spam.
ChrisC