Qual é a diferença entre 'camada de abstração' e 'nível de indireção'?

37

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

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

    
por Theo Lenndorff 30.09.2011 / 22:51
fonte

8 respostas

27

Abstração lida com simplificação, indirecção 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 da máquina e as várias ferramentas para criar aplicativos que são baseados no código da 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 de uma maneira que você vê é o que obtém. A posição de um widget de 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 #). C # em si não é manipulado usando código de máquina, ele é manipulado usando um "Common Runtime Environment", que é uma abstração de um computador e sistema operacional.

  • Indirection refere-se a tornar a localização de um item transparente. Se você souber o URI de um recurso da web, poderá acessar o recurso sem saber sua localização precisa. Você não acessa o recurso diretamente, em vez disso, acessa por meio de um canal que passa sua solicitação por meio de uma série de servidores, aplicativos e roteadores. Indirection pode ser considerado como um tipo especial de abstração, onde a localização é abstraída.

por 09.10.2011 / 21:39
fonte
26

As abstrações são implementadas por meio de 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 indireto por meio de uma tabela de páginas. Em vez de acessar diretamente os endereços de memória física, eles são traduzidos de um endereço virtual para um endereço físico.

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

    
por 01.10.2011 / 00:14
fonte
7

Meu entendimento é que a abstração refere-se principalmente a funções e a indirecção refere-se principalmente a dados. Em outras palavras, o nível de abstração é quão profundo seu rastreio de pilha fica, e o nível de indireção é quantos ponteiros você deve excluir. Pelo menos é assim que eu uso os termos.

    
por 30.09.2011 / 22:55
fonte
7

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. O nível de indireto, por outro 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 as coisas podem significar a mesma coisa, desde que você use:

  a) step = going from simple code to complex code. 
    
por 01.10.2011 / 00:57
fonte
7

Camada de Abstração e Nível de Indirecionamento são conceitos distintos. Abstração é a agregação e nomeação significativa de vários elementos, como pedaços de dados ou instruções de programas, por exemplo, o conceito de um arquivo ou chamada de método, enquanto a indireção é o desacoplamento 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.

Frequentemente, os conceitos andam de mãos dadas e o que se aplica a um constructo particular 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 indirecção é importante ao adicionar extensibilidade ou criar testes para um aplicativo.

Uma camada de abstração é a agregação de abstrações e dando-lhes 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 este contexto, porque se chamarmos a função de algo como DoAllocMemThenMakeEnvThenFindEntryPoint ... realmente não seria muito abstrato. Uma camada como a API do Win32 fornece uma barreira na qual um programador pode ser avisado para não se aventurar. Ele elimina a complexidade do ponto de vista do chamador ao custo de potência reduzida (flexibilidade, desempenho, etc.). Esse trade-off é destacado pela discussão freqüente de abstrações gotejantes: ainda podemos precisar fazer chamadas SQL diretas ao usar o Hibernate ou fazer chamadas do Win32 ao usar o .NET.

Em relação à indireção indireta, a maioria dos programas não-triviais opera com alguma forma de indireção codificada pelo usuário, veja 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 Indireta de nível 0, uma conexão JNDI (que delega a escolha do recurso a um contêiner de aplicativo) como Nível 1 e alguma construção de Spring que mapeia o identificador JNDI do aplicativo para um dos muitos recursos de contêiner como Nível 2. Vários níveis permitem que um número de partes externas ao relacionamento (nesse caso, um relacionamento entre a execução de código e um banco de dados) manipule 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 indireta a aumenta. A abstração reduz o poder, enquanto a indireta aumenta. O Indirection pode ser usado para restaurar o poder de abstração, permitindo que o comportamento padrão seja substituído por retornos de chamada personalizados.

    
por 02.10.2011 / 11:24
fonte
1

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

    
por 08.09.2017 / 23:59
fonte
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 conectar e chamar o banco de dados. Onde um exemplo de indireção está usando uma estrutura para acessar interrupções. Você ainda está acessando a interrupção quando você define valores na estrutura. é apenas indiretamente através da estrutura, dando nomes de membros struct para pontos específicos na memória.

Assim, a abstração oculta detalhes de implementação nos quais a indireção fornece simplesmente uma interface "indireta" através da qual acessar algo.

A abstração é quando você não precisa entender o que está sendo escondido, onde você faz indiretamente.

    
por 04.10.2011 / 16:23
fonte
-1

Adicionar um nível (ou camada) de abstração e adicionar um nível de indireção são as duas maneiras de dizer a mesma coisa. Quando você resolve um problema, você 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 a solução do problema novamente, mas de maneira mais geral; Isso envolverá a introdução de outro nível mais alto de abstração. E essa nova solução, mais geral, é ainda mais indireta do que a solução indireta original - ou seja, que outro nível de indireção tenha sido introduzido.

    
por 08.09.2017 / 05:42
fonte