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'.
computer-science
terminology
Theo Lenndorff
fonte
fonte
Respostas:
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.
fonte
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.
fonte
Primeiro, vamos tentar definições adequadas para os termos:
Camada de abstração significa:
Por outro lado, o nível de indireção significa:
Ambas as coisas podem significar a mesma coisa, desde que você use:
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte