Qual é a diferença entre 'layer of abstraction' e 'level of indirection'?


38

Não tenho certeza se os dois termos podem ser usados ​​de forma intercambiável. Talvez exista alguma distinção acadêmica em ciência da computação que não seja relevante para a programação diária? Ou posso usar os dois termos de forma intercambiável sem estar errado? Talvez dependa do contexto em que uso os dois termos?

Edit: Por que eu acho os dois termos possivelmente intercambiáveis, é uma entrada da Wikipedia sobre a camada Abstração . Lá você encontra a citação de David Wheelers: 'Todos os problemas em ciência da computação podem ser resolvidos por outro nível de indireção'.


7
... exceto o problema de muitos níveis de indireção!
Mason Wheeler

@MasonWheeler: Você pode adicionar outro nível, menos indireta de engano ...
Jon Purdy

O C ++ permite adicionar uma camada de abstração sem uma camada de indireção, para que elas não possam significar o mesmo.
Fredoverflow 01/10/11

Respostas:


30

Abstração lida com simplificação, indiretamente lida com localização.

  • Abstraçãoé um mecanismo que "oculta" detalhes complicados de um objeto em termos de termos mais simples e fáceis de manipular. Na programação, um bom exemplo é a diferença de detalhes entre o código de máquina e as várias ferramentas para criar aplicativos que são baseados no código de máquina. Considere criar um aplicativo Windows Form com o Visual Studio IDE. O IDE permite que você pense no aplicativo em termos de itens fáceis de manipular da maneira O que você vê é o que você obtém. A posição de um widget da tela é abstraída para um local visual em um quadro que você pode alterar arrastando o widget. Internamente, o IDE manipula o widget usando outra camada de abstração, como uma linguagem de alto nível (como C #). O C # em si não é manipulado usando o código da máquina, é manipulado usando um "Common Runtime Environment"

  • Indirecionamento refere-se a tornar transparente a localização de um item. Se você conhece o URI de um recurso da Web, pode acessar o recurso sem saber sua localização precisa. Você não acessa o recurso diretamente; em vez disso, acessa através de um canal que passa sua solicitação através de uma série de servidores, aplicativos e roteadores. O indireto pode ser considerado um tipo especial de abstração onde o local é abstraído.


2
+1 melhor resposta até agora! Estava prestes a escrever um, mas este está perto o suficiente do que eu tinha em mente.
Newtopian 10/10

27

Abstrações são implementadas usando indireção.

Por exemplo, memória virtual: A abstração é um espaço de endereço contíguo inteiramente à sua disposição. Essa abstração é implementada usando indireção através de uma tabela de páginas. Em vez de acessar diretamente os endereços de memória física, eles são convertidos de um endereço virtual para um endereço físico.

Para adicionar uma camada de abstração, você deve adicionar uma camada de indireção. Mas adicionar indireção não significa necessariamente uma abstração. Por exemplo, ter getters e setters em cada variável é uma camada de indireção, mas se tudo o que eles fazem é obter e definir valores simples, não há abstração.


2
De fato, o último exemplo não é muito bom. Os getters e setters simples adicionam abstração. O único que sabe, é claro, é a classe que os declara. Se você decidir alterar a implementação, qualquer código criado na abstração não será afetado.
back2dos

você pode dar um exemplo melhor, que é indireto, mas não desastroso?
Coder,

11
definitivamente um exemplo errado
Morg.

3
Quem disse alguma coisa sobre as aulas? Eu também não disse nada sobre como alterar a visibilidade de uma variável. Nada está impedindo que você acesse diretamente; é uma variável Mas você também pode fazê-lo com um nível de indireção através do getter e setter. Como a semântica de usar o getter e o setter é a mesma que acessar diretamente a variável, não há abstração.
Austin

2
Exceto que o getter e o setter não necessariamente acessam 'apenas' a variável. Se você estiver usando um getter e um setter, estará adicionando uma abstração, pois poderá alterá-los para usar uma variável diferente sem que o usuário esteja ciente disso, portanto, uma abstração.
Dominique McDonnell

9

Primeiro, vamos tentar definições adequadas para os termos:

  1. Camada de abstração 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. Por outro lado, o nível de indireção 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 as coisas podem significar a mesma coisa, desde que você use:

  a) step = going from simple code to complex code. 

7

Meu entendimento é que a abstração se refere principalmente a funções e a indireta se refere principalmente a dados. Em outras palavras, o nível de abstração é a profundidade do rastreamento da pilha e o nível de indireção é quantos ponteiros você tem para desreferenciar. Pelo menos é assim que eu uso os termos.


com funções virtuais sendo modeladas como ponteiros para funções?
Caleth

7

Camada de Abstração e Nível de Indirecionamento são conceitos distintos. Abstração é a agregação e a nomeação significativa de vários elementos, como dados ou instruções de programas, por exemplo, o conceito de chamada de arquivo ou método, enquanto indireto é a dissociação de entidades para facilitar o adiamento da realização de seu relacionamento, por exemplo, o uso de JNDI para separar a identificação de um recurso dentro de um programa do recurso real que pode eventualmente ser fornecido por um contêiner de aplicativo.

Freqüentemente, os conceitos andam de mãos dadas e qual deles se aplica a um construto específico depende de qual exercício ou discussão está em andamento. Por exemplo, a natureza abstrata de uma interface é importante ao aprender ou documentar uma API; sua propriedade de indireção é importante ao adicionar extensibilidade ou criar testes para um aplicativo.

Uma camada de abstração é a agregação de abstrações e oferece a elas uma integridade conceitual e consistência de uso. CreateProcess é o nome da API do win32 para um monte de código que cria e executa um processo. O "nome" é significativo para esse contexto, porque se chamarmos a função de algo como DoAllocMemThenMakeEnvThenFindEntryPoint ... realmente não seria muito abstrato. Uma camada como a API Win32 fornece uma barreira através da qual um programador pode ser aconselhado a não se aventurar. Ele remove a complexidade do ponto de vista do chamador ao custo de energia reduzida (flexibilidade, desempenho, etc.). Esse trade-off é destacado pela discussão frequente de abstrações com vazamentos: ainda podemos precisar fazer chamadas SQL diretas ao usar o Hibernate ou fazer chamadas Win32 ao usar o .NET.

Em relação à indireção, a maioria dos programas não triviais opera com alguma forma de indireção codificada pelo usuário, testemunha a seção INPUT-OUTPUT do COBOL antes da arca. Ao acessar um recurso, como um banco de dados, podemos ver a incorporação de uma cadeia de conexão JDBC no código como nível 0, uma conexão JNDI (que delega a escolha do recurso para um contêiner de aplicativo) como Nível 1 e algumas construções Spring que mapeiam o identificador JNDI do aplicativo para um dos muitos recursos do contêiner como Nível 2. Vários níveis permitem que várias partes externas ao relacionamento (nesse caso, um relacionamento entre a execução de código e um banco de dados) manipulem esse relacionamento. Isso se aplica igualmente aos componentes internos do programa, como interfaces e eventos.

Vemos que, não importa quais sejam suas outras qualidades, a abstração reduz a complexidade, enquanto a indução a aumenta. A abstração reduz o poder, enquanto a indução aumenta. O indireto pode ser usado para restaurar o poder da abstração, permitindo que o comportamento padrão seja substituído por retornos de chamada personalizados.


1

Um ponteiro para um ponteiro para um ponteiro para um ponteiro para um ponteiro para um ponteiro para int possui seis níveis de indireção, mas nenhuma camada de abstração.


0

Um bom exemplo de abstração é chamar um único método para armazenar um item em um banco de dados. O método abstrai os detalhes de conexão e chamada do banco de dados. Onde um exemplo de indireção está usando uma estrutura para acessar interrupções. Você ainda está acessando a interrupção ao definir valores na estrutura. é apenas indiretamente através da estrutura, atribuindo nomes de membros à estrutura a pontos específicos na memória.

Portanto, a abstração oculta detalhes da implementação, onde a indireção simplesmente fornece uma interface "indireta" por meio da qual acessar algo.

Abstração é quando você não precisa entender o que está sendo oculto, onde, indiretamente, você faz.


-1

Adicionar um nível (ou camada) de abstração e adicionar um nível de indireção são as duas maneiras simples de dizer a mesma coisa. Quando você resolve um problema, geralmente tenta uma solução direta. Às vezes isso não é possível, então você tenta uma solução indireta. Isso requer a introdução de alguma abstração para simplificar o problema - porque o problema é complexo e não pode ser resolvido diretamente. Tendo resolvido o problema pela abordagem indireta, não há razão para não considerar resolvê-lo novamente, mas de maneira mais geral; Isso envolverá a introdução de outro nível mais alto de abstração. E essa solução nova e mais geral é ainda mais indireta que a solução indireta original - ou seja, para que outro nível de indireção seja introduzido.


3
este não parece acrescentar nada substancial sobre pontos feitos e explicado em anteriores 7 respostas
mosquito

Obrigado, Gnat. Entendo o seu ponto, e é uma pena que esta questão interessante atraia muito spam!
ChrisC
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.