O que é abstração? [fechadas]

38

Existe uma definição geralmente acordada para o que é uma abstração de programação usada pelos programadores? [Observe que abstração de programação não deve ser confundida com definições de dicionário para a palavra "abstração".]] Existe uma definição inequívoca ou mesmo matemática? Quais são alguns exemplos claros de abstrações?

mlvljr
fonte
..e sendo forçados a provar que eu não sou um robô ao postar isso sugere Estou realmente pedir demais :)
mlvljr
8
O que você quer dizer com "matematicamente"? Eu realmente não pensaria em abstração como um conceito matemático.
Fishtoaster
2
@mlvljr: Me desculpe, ainda não tenho certeza de seguir. Abstração é apenas a prática de fornecer uma maneira mais simples de lidar com algo. Não vejo como ferramentas / métodos formais têm algo a ver com isso.
Fishtoaster
1
@mlvljr, você quer um exemplo de matemática ou uma matemática para cobrir todas as extrações de programação. Eu não acho que o último exista.
C. Ross
8
Perhpas cstheory.stackexchange.com é o lugar certo para esta pergunta
Conrad Frix

Respostas:

46

A resposta para "Você pode definir o que é uma abstração de programação mais ou menos matematicamente?" é não." Abstração não é um conceito matemático. Seria como pedir a alguém para explicar matematicamente a cor de um limão.

Se você deseja uma boa definição: abstração é o processo de passar de uma idéia específica para uma mais geral. Por exemplo, dê uma olhada no seu mouse. É sem fio? Que tipo de sensor possui? Quantos botões? É ergonômico? Quão grande é isso? As respostas para todas essas perguntas podem descrever com precisão o mouse, mas, independentemente das respostas, ainda é um mouse, porque é um dispositivo apontador com botões. É tudo o que é preciso para ser um mouse. "Silver Logitech MX518" é um item concreto e específico, e "mouse" é uma abstração disso. Uma coisa importante a se pensar é que não existe um objeto concreto como um "mouse", é apenas uma idéia. O mouse na sua mesa é sempre algo mais específico - é '

A abstração pode ser em camadas e com granulação fina ou grossa, como você desejar (um MX518 é um mouse, um objeto apontador, um periférico de computador, um objeto alimentado por eletricidade) e pode ir até onde você quiser , e em praticamente qualquer direção que você desejar (meu mouse tem um fio, o que significa que eu posso categorizá-lo como um objeto com um fio. Também é plano na parte inferior, para que eu possa categorizá-lo como um tipo de objeto que não rola quando colocado na vertical em um plano inclinado).

A programação orientada a objetos é construída sobre o conceito de abstrações e famílias ou grupos deles. Uma boa OOP significa escolher boas abstrações no nível de detalhe apropriado, que faça sentido no domínio do seu programa e não "vaze". O primeiro significa que classificar um mouse como um objeto que não rola em um plano inclinado não faz sentido para um aplicativo que inventa equipamentos de computador, mas pode fazer sentido para um simulador de física. O último significa que você deve evitar "encaixar-se" em uma hierarquia que não faz sentido para algum tipo de objeto. Por exemplo, na minha hierarquia acima, temos certeza de que todosperiféricos de computadores são alimentados por eletricidade? Que tal uma caneta? Se quisermos agrupar uma caneta na categoria "periférica", teremos um problema, porque ela não usa eletricidade, e definimos periféricos de computador como objetos que usam eletricidade. O problema da elipse circular é o exemplo mais conhecido desse enigma.

nlawalker
fonte
2
Eu acho que vejo; você está falando especificamente sobre se referir a um método ou função de maneira abstrata, ou seja, por seu contrato e não por sua implementação. Suas declarações estão corretas e esse é um uso perfeitamente válido do termo; uma chamada de método é uma abstração de algum tipo de comportamento concreto.
Nlawalker
4
@nlawalker: Você está misturando abstração com generalização. Eles não são a mesma coisa. O que você está descrevendo é o último ("passando de uma idéia específica para uma mais geral "). A abstração está passando de coisas concretas para coisas abstratas, por exemplo, tendo 7 bolinhas azuis e 7 vermelhas e dizendo 'Eu tenho dois conjuntos com o mesmo número de bolinhas da mesma cor': aqui estou passando de bolinhas concretas (bolinhas de gude) para coisas abstratas (classes e conjuntos equivalentes). BTW, um número natural n é a classe de todos os conjuntos equivalentes de cardinalidade n, não circulares definidos por mapeamentos um a um entre esses conjuntos.
pillmuncher
33
Matematicamente, a cor de um limão é clara, com um comprimento de onda de aproximadamente 570 nm.
Erik
1
@ Erik, eu ia escrever isso. Bah!
Gary Rowe
1
@ Erik Isso é física, não matemática :) A matemática não sabe nada sobre conceitos como "luz". A luz é empírica; Matemática não é.
Andres F.
25

Eu discordo categoricamente da maioria das respostas.

Esta é a minha resposta:

Dados dois conjuntos G e H, uma conexão de Galois (alfa, beta) pode ser definida entre eles, e um pode ser considerado uma concretização do outro; inverter a conexão e uma é uma abstração da outra. As funções são uma função de concretização e uma função de abstração.

Isso é da teoria da interpretação abstrata de programas de computador, que normalmente é uma abordagem de análise estática até o momento.

Paul Nathan
fonte
8
OK, você recebe uma estrela de ouro para professorism :)
Mike Dunlavey
@ Mike: Yay? :-)
Paul Nathan
Ah, e pode haver um exemplo?
mlvljr
2
@mlvljr: di.ens.fr/~cousot/AI astree.ens.fr fornece um esboço dos dados.
Paul Nathan
1
Amir: é a definição técnica de abstração do mundo da análise estática.
Paul Nathan
13

Abstração é mais foco Whate menos How. Ou você pode dizer, sabe apenas o que precisa e confia apenas no provedor para todos os outros serviços. Às vezes, até oculta a identidade do provedor de serviços.

Por exemplo, este site fornece um sistema para fazer perguntas e respondê-las. Quase todo mundo aqui sabe quais são os procedimentos para perguntar, responder, votar e outras coisas deste site. Mas muito poucos sabem quais são as tecnologias subjacentes. Por exemplo, se o site foi desenvolvido com ASP.net mvc ou Python, se é executado em um servidor Windows ou Linux, etc. Isso não é da nossa conta. Portanto, este site mantém uma camada de abstração sobre seu mecanismo subjacente para fornecer o serviço.

Alguns outros exemplos:

  • Um carro esconde todos os seus mecanismos, mas fornece uma maneira de dirigir, reabastecer e mantê-lo para seu proprietário.

  • Qualquer API oculta todos os detalhes de sua implementação, fornecendo o serviço a outros programadores.

  • Uma classe no OOP oculta seus membros privados e a implementação de membros públicos que prestam o serviço para chamar os membros públicos.

  • Ao usar um objeto do tipo an Interfaceou an abstract classem Java ou C ++, a implementação real fica oculta. E não apenas ocultas, Interfaceé provável que as implementações dos métodos declarados em também sejam diferentes em várias classes implementadas / herdadas. Mas como você está obtendo o mesmo serviço, não se preocupe, Howele é implementado e exatamente Who/ Whatestá fornecendo o serviço.

  • Esconder identidade : Para a frase "Eu sei que Sam pode escrever programas de computador". a abstração pode ser "Sam é um programador. Programadores sabem como escrever programas de computador". Na segunda declaração, a pessoa não é importante. Mas sua capacidade de fazer programação é importante.

Gulshan
fonte
Então, por que não chamar isso de "especificação exata do quê", btw?
Mlvljr 1/11
1 para o bit satori, também
mlvljr
@mlvljr Um pouco de Howsempre é útil para entender os What. Assim, pode ser misturado com abstração.
Gulshan
7

Uma abstração de programação é um modelo simplificado de um problema.

Por exemplo, uma conexão TCP / IP é uma abstração ao enviar dados. Você apenas inclui um endereço IP e um número de porta e o envia à API. Você não está preocupado com todos os detalhes dos fios, sinais, formatos de mensagem e falhas.

Cruz
fonte
Aha! O que é um modelo simplificado aqui? Lembre-se do quebra-cabeça com vazamentos , btw? :)
mlvljr
7

Uma abstração é apenas a versão de programação de um teorema.

Você tem um sistema formal, propõe um pensamento sobre esse sistema. Você faz uma prova disso e, se der certo, terá um teorema. Sabendo que seu teorema é válido, você pode usá-lo em mais provas do sistema. As primitivas fornecidas pelo sistema (como se instruções e tipos de valores int) normalmente seriam vistas como axiomas, embora isso não seja estritamente verdadeiro, pois qualquer coisa que não seja instruções da CPU escritas no código da máquina é um tipo de abstração.

Na programação funcional, a idéia de um programa como uma declaração matemática é muito forte e, muitas vezes, o sistema de tipos (em uma linguagem forte e de tipo estatístico, como Haskell, F # ou OCAML) pode ser usado para testar a teoria da vida através de provas.

Por exemplo: digamos que temos verificação de adição e igualdade como operações primitivas e números inteiros e booleanos como tipos de dados primitivos. Estes são os nossos axiomas. Então, podemos dizer que 1 + 3 == 2 + 2é um teorema, depois use as regras de adição e números inteiros e igualdade para ver se essa é uma afirmação verdadeira.

Agora vamos supor que desejamos multiplicação, e nossas primitivas (por uma questão de brevidade) incluem uma construção em loop e um meio para atribuir referências simbólicas. Nós poderíamos sugerir que

ref x (*) y := loop y times {x +}) 0

Vou fingir que provei isso, demonstrando que a multiplicação é válida. Agora eu posso usar a multiplicação para fazer mais coisas com o meu sistema (a linguagem de programação).

Também posso verificar meu sistema de tipos. (*) tem um tipo de int -> int -> int. Leva 2 ints e gera um int. A adição possui um tipo de int -> int -> int, de modo que o 0 + (descanso) se mantém enquanto (resto) resultar em um int. Meu loop pode estar fazendo todo tipo de coisa, mas estou dizendo que gera uma cadeia de funções com caril, de modo que (x + (x + (x ... + 0))) é o resultado. A forma dessa cadeia de adição é apenas (int -> (int -> (int ... -> int))), então eu sei que minha saída final será uma int. Então, meu sistema de tipos reteve os resultados de minha outra prova!

Componha esse tipo de idéia ao longo de muitos anos, muitos programadores e muitas linhas de código, e você terá linguagens de programação modernas: um conjunto saudável de primitivas e enormes bibliotecas de abstrações de código "comprovadas".

CodexArcanum
fonte
4

A resposta da Wikipedia seria boa o suficiente? http://en.wikipedia.org/wiki/Abstraction_%28programming%29

Na ciência da computação, o mecanismo e a prática da abstração reduzem e fatoram os detalhes para que você possa se concentrar em alguns conceitos de cada vez.

John Fisher
fonte
E qual seria um exemplo de uma coisa abstraída então?
mlvljr
3
@mlvljr: Se você ler o artigo da wikipedia, verá alguns.
John John Fisher
Infelizmente, eu sou muito bonito certeza que eles vão ser muito abstrato demais ..
mlvljr
4

Bem, matematicamente, "número inteiro" é uma abstração. E quando você faz provas formais como x + y = y + x para todos os números inteiros, você trabalha com a abstração "número inteiro" em vez de números específicos como 3 ou 4. O mesmo ocorre no desenvolvimento de software quando você interage com o a um nível acima dos registradores e locais de memória. Você pode ter pensamentos mais poderosos em um nível mais abstrato, na maioria dos casos.

Kate Gregory
fonte
Não vai usar e IInt add(IInt a, IInt b);sub-rotina em um programa onde você sabe de antemão que ae bserá, digamos, Int128: IIntmais ou menos bom exemplo? - ou você tem seu código fazendo o que deveria, sabendo (sendo capaz de provar) fará o que você precisa e, ao mesmo tempo (e por outro lado), você faz exatamente o que você precisa precisa sem nunca saber (com a capacidade de usar essa coisa em outros contextos também)?
mlvljr
1
Desculpe, mas não consigo entender sua pergunta.
Kate Gregory
Bem, suponha que você esteja escrevendo um programa que precisa adicionar 2 a 3. Você faz isso chamando uma add(int, int)sub - rotina / função. Será suficiente tê-lo exatamente return 2 + 3;neste caso. E por que você deveria usar uma rotina mais "universal" ( return a + b;ou seja, operar com quaisquer parâmetros reais a e bfornecidos e, portanto, verdadeiramente abstratos de seus valores) - essa foi minha pergunta (retórica) acima. Espero que tenha ficado um pouco mais claro agora.
mlvljr
Meu primeiro comentário é bastante "auto-ofuscado", eu concordo :)
mlvljr
4

Você está recebendo boas respostas aqui. Gostaria apenas de advertir - as pessoas pensam que a abstração é de alguma forma essa coisa maravilhosa que precisa ser colocada em um pedestal e da qual você não se cansa. Não é. É apenas senso comum. É apenas reconhecer as semelhanças entre as coisas, para que você possa aplicar uma solução de problemas a uma variedade de problemas.

Permita-me uma irritação ...

No topo da minha lista de aborrecimentos está quando as pessoas falam de "camadas de abstração" como se isso fosse uma coisa boa. Eles fazem "wrappers" em torno de classes ou rotinas que não gostam e os chamam de "mais abstratos", como se isso os tornasse melhores. Lembra da fábula da "Princesa e a Ervilha"? A princesa era tão delicada que, se houvesse uma ervilha embaixo do colchão, ela não conseguiria dormir, e adicionar mais camadas de colchões não ajudaria. A idéia de que adicionar mais camadas de "abstração" ajudará é exatamente assim - geralmente não. Significa apenas que qualquer alteração na entidade base deve ser alterada através de várias camadas de código.

Mike Dunlavey
fonte
Pensar na abstração como algo "bonito demais para ser claramente percebido (ou, mais ainda, descrito em termos secos (matemáticos)" não ajuda (em primeiro e pelo menos) a entender o que é e (em segundo) a desenvolver técnicas de aplicação e avaliação (horror!) [de como e de que forma o código fornecido é resumo].
mlvljr
3
Se uma mudança em um lugar faz com que você faça várias alterações em outro lugar, suas abstrações são ruins. Em essência, não direi que eu ou qualquer outra pessoa nunca errei ao lado de muita abstração, mas há um método para essa loucura. Boas abstrações são a pedra angular do código fracamente acoplado. Dada a abstração correta, as mudanças se tornam ridiculamente simples. Então, sim, coloco abstrações em um pedestal e passo uma quantidade excessiva de tempo encontrando as corretas.
Jason Baker
@ Jason Baker Let técnicas a nossa captação de ser apenas o suficiente concreto para usar eficazmente ...
mlvljr
1
@ Jason: "Se uma mudança em um lugar faz com que você faça várias alterações em outro lugar, suas abstrações são ruins." Eu estou com você lá. Eu pareço estar cercado por pessoas más.
Mike Dunlavey 11/11
1
Parece que você trabalhou em um lugar onde os desenvolvedores tiveram grandes visões e não havia um chefe forte para manter a equipe focada. Quando me encontro em um ambiente como esse, começo a procurar outro emprego (os orçamentos do projeto sempre acabam ou a empresa é pequena o suficiente => falida). Eu vi um tweet recentemente: 'código de espaguete' vs. 'código de lasanha', o último é quando há camadas demais.
yzorg 18/12/10
4

Acho que você pode achar útil uma publicação minha sobre abstrações com vazamentos. Aqui está o contexto relevante:

A abstração é um mecanismo para ajudar a entender o que é comum entre um conjunto de fragmentos de programas relacionados, remover suas diferenças e permitir que os programadores trabalhem diretamente com uma construção que representa esse conceito abstrato. Esse novo construto (virtualmente) sempre possui parametrizações : um meio de personalizar o uso do construto para atender às suas necessidades específicas.

Por exemplo, uma Listclasse pode abstrair os detalhes de uma implementação de lista vinculada - onde, em vez de pensar em termos de manipulação nexte previousponteiros, você pode pensar no nível de adicionar ou remover valores a uma sequência. A abstração é uma ferramenta essencial para criar recursos úteis, ricos e às vezes complexos a partir de um conjunto muito menor de conceitos mais primitivos.

A abstração está relacionada ao encapsulamento e à modularidade, e esses conceitos geralmente são mal compreendidos.

No Listexemplo, o encapsulamento pode ser usado para ocultar os detalhes de implementação de uma lista vinculada; em uma linguagem orientada a objetos, por exemplo, você pode tornar os ponteiros nexte previousprivados, onde apenas a implementação da Lista tem permissão para acessar esses campos.

O encapsulamento não é suficiente para abstração, porque não implica necessariamente que você tenha uma concepção nova ou diferente das construções. Se tudo o que uma Listclasse fez foi fornecer métodos acessadores de estilo ' getNext' / ' setNext', eles seriam encapsulados a partir dos detalhes da implementação (por exemplo, você nomeou o campo ' prev' ou ' previous'? Qual era o tipo estático?), Mas teria um grau muito baixo de abstração.

A modularidade está preocupada com a ocultação de informações : propriedades estáveis ​​são especificadas em uma interface e um módulo implementa essa interface, mantendo todos os detalhes de implementação dentro do módulo. A modularidade ajuda os programadores a lidar com as mudanças, porque outros módulos dependem apenas da interface estável.

A ocultação de informações é auxiliada pelo encapsulamento (para que seu código não dependa de detalhes instáveis ​​da implementação), mas o encapsulamento não é necessário para modularidade. Por exemplo, você pode implementar uma Listestrutura em C, expondo os ' next' e ' prevponteiros' para o mundo, mas também proporcionar uma interface, que contém initList(), addToList()eremoveFromList()funções. Desde que as regras da interface sejam seguidas, você pode garantir que certas propriedades sempre serão mantidas, como garantir que a estrutura de dados esteja sempre em um estado válido. [O artigo clássico de Parnas sobre modularidade, por exemplo, foi escrito com um exemplo em montagem. A interface é um contrato e uma forma de comunicação sobre o design, não precisa necessariamente ser verificada mecanicamente, embora seja nisso que confiamos hoje.]

Embora termos como abstrato, modular e encapsulado sejam usados ​​como descrições positivas do design, é importante perceber que a presença de qualquer uma dessas qualidades não fornece automaticamente um bom design:

  • Se um algoritmo n ^ 3 for "bem encapsulado", ele ainda terá desempenho pior que um algoritmo n log n aprimorado.

  • Se uma interface se comprometer com um sistema operacional específico, nenhum dos benefícios de um design modular será alcançado quando, digamos, um videogame precisar ser portado do Windows para o iPad.

  • Se a abstração criada expor muitos detalhes não essenciais, ela falhará ao criar uma nova construção com suas próprias operações: será simplesmente outro nome para a mesma coisa.

Macneil
fonte
Bem, isso parece ser o que eu realmente queria (algumas "reclamações" à prova de senso comum / exemplo na "modular == resumo == bom == você nunca pode estimar que apenas luta") , obrigado (ainda lendo)
mlvljr
E aqui está um lema provocador da minha resposta a seguir (para minha própria pergunta) "As
abstrações
2

Ok, acho que descobri o que você está perguntando: "O que é uma definição matematicamente rigorosa de 'Uma Abstração'".

Se for esse o caso, acho que você está sem sorte - 'abstração' é um termo de arquitetura / design de software e não tem nenhum suporte matemático até onde eu saiba (talvez alguém melhor versado em CS teórico me corrija aqui), mais do que "acoplamento" ou "ocultação de informações" têm definições matemáticas.

Fishtoaster
fonte
2

Abstração é quando você ignora detalhes considerados irrelevantes em favor daqueles considerados relevantes.

A abstração abrange encapsulamento, ocultação de informações e generalização. Não abrange analogias, metáforas ou heurísticas.

Qualquer formalismo matemático para o conceito de abstração seria ele próprio ser uma abstração, como seria necessariamente a coisa subjacente a ser captada em um conjunto de propriedades matemáticas! A noção de morfismo da teoria da categoria é provavelmente a mais próxima do que você está procurando.

Abstração não é algo que você declara, é algo que você faz .

Steven A. Lowe
fonte
+1, "Eu faço abstração!" vai ser legal para uma camiseta;) Obrigado pelo link do (s) morfismo (s) (embora ele não mencione diretamente o poli - um entre os doze mencionados);)) também.
mlvljr
2

Como forma de explicar isso a outra pessoa, eu faria o contrário, a partir dos resultados anteriores:

A abstração na programação de computadores é o ato de generalizar algo a tal ponto que mais de uma coisa semelhante pode geralmente ser tratada como a mesma e tratada da mesma forma.

Se você quiser expandir isso, pode adicionar:

Às vezes, isso é feito para obter um comportamento polimórfico (interfaces e herança) para reduzir o código repetitivo antecipadamente; outras vezes, para que o funcionamento interno de algo possa ser substituído em uma data futura por uma solução semelhante sem ter que alterar o código. código do outro lado do contêiner ou invólucro abstraído, esperamos reduzir o retrabalho no futuro.

Além disso, acho que você tem que começar em exemplos ...

Conta
fonte
1

Você pode conferir algumas das métricas de Bob Martin

http://en.wikipedia.org/wiki/Software_package_metrics

Dito isto, não acho que a "Abstração" dele seja a mesma que a sua. Ele é mais uma medida de "falta de implementação em uma classe", significando o uso de interfaces / classes abstratas. Instabilidade e distância da sequência principal provavelmente contribuem mais para o que você está procurando.

MIA
fonte
Sim, lembre-se daquele papel. Tio Bob é brilhante em energizar a multidão e fazer as pessoas se interessarem pela mecânica do OO.
mlvljr
Estranhamente, eu esqueci de upvote (ao mesmo tempo) :)
mlvljr
1

Merriam-webster define abstrato como um adjetivo: desassociado de qualquer instância específica.

Uma abstração é um modelo de algum sistema. Eles geralmente listam um grupo de suposições que precisam ser atendidas para que um sistema real possa ser modelado pela abstração e são frequentemente usadas para nos permitir conceituar sistemas cada vez mais complicados. Passar de um sistema real para uma abstração não possui nenhum método matemático formal para fazê-lo. Isso depende do julgamento de quem está definindo a abstração e qual é o objetivo da abstração.

Muitas vezes, porém, as abstrações são definidas em termos de construções matemáticas. Provavelmente porque eles são frequentemente usados ​​em ciência e engenharia.

Um exemplo é a mecânica newtoniana. Assume que tudo é infinitamente pequeno e que toda a energia é conservada. As interações entre objetos são claramente definidas por fórmulas matemáticas. Agora, como sabemos, o universo não funciona dessa maneira e, em muitas situações, a abstração vaza. Mas em muitas situações, funciona muito bem.

Outro modelo abstrato são elementos típicos de circuitos lineares, resistores, capacitores e indutores. Novamente, as interações são claramente definidas por fórmulas matemáticas. Para circuitos de baixa frequência ou drivers de relé simples e outras coisas, a análise RLC funciona bem e fornece resultados muito bons. Mas outras situações, como circuitos de rádio por microondas, os elementos são grandes demais, as interações são mais refinadas e as abstrações simples de RLC não se sustentam. O que fazer nesse momento depende do julgamento do engenheiro. Alguns engenheiros criaram outra abstração em cima dos outros, alguns substituindo os amplificadores operacionais ideais por novas fórmulas matemáticas para o funcionamento, outros substituem os amplificadores operacionais ideais pelos amplificadores operacionais reais simulados, que por sua vez são simulados com uma complexa rede de elementos ideais.

Como outros já disseram, é um modelo simplificado. É uma ferramenta usada para entender melhor sistemas complexos.

whatsisname
fonte
Eu provavelmente deveria ter enfatizado isso melhor, mas não estou interessado no tipo de abstrações que carecem de detalhes desnecessários de seus protótipos do mundo real, mas, portanto, fornecem algumas dicas úteis sobre o design de sistemas que devem lidar com os objetos do mundo real acima mencionados (o exemplo é a construção de uma classe Employee com algumas propriedades do Employee do mundo real, possivelmente úteis em um aplicativo de negócios). O que me interessa é o tipo de abstração que "mura" uma entidade de software de outras entidades que lidam com ela (exemplo serão Employeras suposições de Employee).
mlvljr
1
Você não está fazendo nenhum sentido. Fornecer dicas sobre como projetar um sistema real não é um objetivo para uma abstração. Se você não sabe nada sobre o que está sendo modelado, isso não é um problema para uma abstração resolver.
Whatsisname
Eu estava falando sobre abstrair detalhes dos objetos do mundo real com os quais o software lidará - no processo de criação desse software. O uso de uma abstração (de software) de uma entidade do mundo real para (re) projetar essa coisa do mundo real não foi feito (são "sistemas de software" como "sistemas" em "mas, portanto, fornece algumas dicas úteis sobre o design de sistemas" em meu comentário acima).
mlvljr
1

Uma abstração está representando algo (por exemplo, um conceito, uma estrutura de dados, uma função) em termos de outra coisa. Por exemplo, usamos palavras para se comunicar. Uma palavra é uma entidade abstrata que pode ser representada em termos de sons (fala) ou em termos de símbolos gráficos (escrita). A idéia principal de uma abstração é que a entidade em questão seja distinta da representação subjacente, assim como uma palavra não são os sons usados ​​para pronunciá-la ou as letras usadas para escrevê-la.

Assim, pelo menos em teoria, a representação subjacente de uma abstração pode ser substituída por uma representação diferente. Na prática, no entanto, a abstração raramente é inteiramente distinta da representação subjacente e, às vezes, a representação " vaza ". Por exemplo, a fala carrega tons emocionais que são muito difíceis de transmitir por escrito. Por isso, uma gravação de áudio e uma transcrição das mesmas palavras podem ter efeitos muito diferentes sobre o público. Em outras palavras, a abstração de palavras geralmente vaza.

Abstrações geralmente vêm em camadas. As palavras são abstrações que podem ser representadas por letras, que por sua vez são abstrações de sons, que são abstrações do padrão de movimento das partículas de ar criadas pelas cordas vocais e detectadas pelos tímpanos. .

Em ciência da computação, os bits são tipicamente o nível mais baixo de representação. Bytes, locais de memória, instruções de montagem e registros de CPU são o próximo nível de abstração. Em seguida, temos tipos de dados primitivos e instruções de uma linguagem de nível superior, que são implementadas em termos de bytes, locais de memória e instruções de montagem. Em seguida, funções e classes (assumindo uma linguagem OO) implementadas em termos de tipos de dados primitivos e instruções de linguagem incorporadas. Em seguida, funções e classes mais complexas são implementadas em termos das mais simples. Algumas dessas funções e classes implementam estruturas de dados, como listas, pilhas, filas, etc. Essas, por sua vez, são usadas para representar entidades mais específicas, como uma fila de processos, uma lista de funcionários ou uma tabela de títulos de livros. .

Dima
fonte
1
Se está vazando, então obviamente não é uma abstração ... basta, vamos ser honestos.
mlvljr
2
@mlvljr Infelizmente, os computadores não são problemas de matemática, então você deve permitir algum nível de vazamento. Se nada mais, o fato de os cálculos estarem sendo executados em um dispositivo físico implica certas restrições no escopo dos problemas que podem ser modelados. Tecnicamente, os teoremas da incompletude implicam que certas coisas não podem ser provadas internamente sobre sistemas matemáticos, portanto, mesmo a matemática tem "abstrações com vazamentos".
CodexArcanum
2
Você sempre pode encontrar uma situação em que uma abstração vazará. Não existe abstração perfeita. É simplesmente uma questão de quanto ele vaza e se você pode viver com ele.
Dima
@CodexArcanum 1. Uma rotina usando um valor intmenor que (MAX_INT_SIZE / 2-1) e retornando outra que é o dobro: int f(int a) { return a*2; }2. um "manipulador" com um protótipo void (*) (void)a ser chamado quando ... uhmm, deve ser chamado de acordo com o contrato do chamador - ambos representam abstrações (1 - sobre os detalhes de sua implementação (que fornecemos, mas que não serão acessíveis para quem não tem acesso ao código fonte), 2 - sobre o que exatamente o manipulador faz (observe, no entanto, que isso é conhecido pela pessoa que atribuiu o manipulador)) e não vaza
mlvljr
A restrição em MAX_INT_SIZE não é esclarecida em nenhum lugar da assinatura do seu método. A menos que você use uma linguagem que permita a programação baseada em contrato (como Eiffel), é um vazamento. Mencionar restrições na documentação não conta, porque a documentação está fora do sistema. E se a energia desligar no meio de uma operação? E se você tiver que transmitir dados através de uma rede e houver latência? Nenhum paradigma de programação pode abstrair a fisicalidade do hardware do sistema.
CodexArcanum
1

Uma maneira de tentar descrevê-lo para as pessoas, pode não ser o melhor

Considere um programa que adicione 2 + 2 e produz 4

Considere um programa que adicione dois números introduzidos por um usuário, x + y = z

Qual é mais útil e geral?

Bryan Harrington
fonte
Isso é quase o que meu comentário sobre a resposta de Kate Gregory. ;) O interessante é que, embora o programa menos geral possa utilizar o mais geral, fornecer um usuário que solicitou o primeiro com o segundo provavelmente seria contra-útil ...
mlvljr
1

Eu argumentaria que uma abstração é algo que oculta detalhes desnecessários. Uma das unidades mais básicas de abstração é o procedimento. Por exemplo, não quero me preocupar com como estou salvando dados no banco de dados ao ler esses dados de um arquivo. Então, eu crio uma função save_to_database.

As abstrações também podem ser unidas para formar abstrações maiores. Por exemplo, funções podem ser reunidas em uma classe, classes podem ser reunidas para formar um programa, programas podem ser reunidos para formar um sistema distribuído, etc.

Jason Baker
fonte
A chamada de código save_to_databasenão deve se preocupar sobre como exatamente os dados são salvos, desde / porque você escolheu a implementação que precisa ! Ou seja, haverá um lugar para fornecer os detalhes (abstratos "relativos" a alguns trechos de código) de qualquer maneira, é apenas a questão de escolhê-los criteriosamente - proporcionando uma "mudança de mente" mais fácil etc.
mlvljr
1

Eu sempre penso em abstração na programação como ocultando detalhes e fornecendo uma interface simplificada. É a principal razão pela qual os programadores podem dividir tarefas monumentais em partes gerenciáveis. Com a abstração, você pode criar a solução para uma parte do problema, incluindo todos os detalhes, e fornecer uma interface simples para usar a solução. Então você pode "esquecer" os detalhes. Isso é importante porque não há como uma pessoa manter em mente todos os detalhes de um sistema super complexo. Isso não quer dizer que os detalhes abaixo da abstração nunca precisarão ser revisados, mas, por enquanto, apenas a interface deve ser lembrada.

Na programação, essa interface simplificada pode variar de uma variável (abstrai um grupo de bits e fornece uma interface matemática mais simples) a uma função (abstrai qualquer quantidade de processamento em uma chamada de linha única) a uma classe e além.

No final, o principal trabalho dos programadores é abstrair todos os detalhes computacionais e fornecer uma interface simples como uma GUI que alguém que não sabe nada sobre como os computadores funcionam pode fazer uso.

Algumas das vantagens da abstração são:

  • Permite que um grande problema seja dividido em partes gerenciáveis. Ao adicionar registros de uma pessoa a um banco de dados, você não precisa mexer na inserção e no equilíbrio de árvores de índice no banco de dados. Esse trabalho pode ter sido feito em algum momento, mas agora foi abstraído e você não precisa mais se preocupar com isso.

  • Permite que várias pessoas trabalhem bem juntas em um projeto. Não quero conhecer todos os detalhes do código do meu colega. Eu só quero saber como usá-lo, o que faz e como ajustá-lo ao meu trabalho (a interface).

  • Permite que pessoas que não possuem o conhecimento necessário realizem uma tarefa complexa. Minha mãe pode atualizar seu facebook e as pessoas que ela conhece em todo o país podem vê-lo. Sem a abstração de um sistema incrivelmente complexo para uma interface da Web simples, não há como ela começar a fazer algo semelhante (nem eu, nesse caso).

A abstração pode, no entanto, ter o efeito inverso de tornar as coisas menos gerenciáveis ​​se forem usadas em excesso. Ao dividir um problema em muitos pedaços pequenos, o número de interfaces que você precisa lembrar aumenta e fica mais difícil entender o que realmente está acontecendo. Como a maioria das coisas, um equilíbrio deve ser encontrado.

Jason B
fonte
1

Um nível extra de indireção.

Você não quer se importar se o objeto que está usando é um Catou um Dog, então você percorre uma tabela de funções virtuais para encontrar o caminho certo.makeNoise() função .

Tenho certeza de que isso também pode ser aplicado aos níveis 'inferior' e 'superior' - pense em um compilador procurando a instrução correta a ser usada para um determinado processador ou o Monadresumo de Haskell sobre os efeitos computacionais chamando tudo returne >>=.

yatima2975
fonte
1

Isso é algo que eu realmente queria publicar no blog por mais tempo, mas nunca cheguei a isso. Felizmente, sou um zumbi representante e há até uma recompensa. Meu post acabou bastante longo , mas aqui está a essência:

Abstração na programação é entender a essência de um objeto dentro de um determinado contexto.

[...]

A abstração não se confunde apenas com generalização, mas também com encapsulamento, mas estas são as duas partes ortogonais do ocultação de informações: O módulo de serviço decide o que está disposto a mostrar e o módulo cliente decide o que está disposto a ver. Encapsulamento é a primeira parte e abstração a última. Somente os dois juntos constituem um esconderijo completo de informações.

Espero que ajude.

back2dos
fonte
+1, Sim, o tópico parece realmente incomodar muitos de nós;) Espero (finalmente) complementar sua resposta com alguns pontos meus para provocar um pouco mais de interesse na discussão.
mlvljr
0

Aqui, uma resposta não matemática:

Abster-se de programar é fingir que você não se importa com os detalhes agora, enquanto na verdade você se importa e deve se preocupar com eles o tempo todo. É basicamente fingir.

mojuba
fonte
1
+1, mas nem sempre eu penso (pense em detalhes realmente desnecessários :)). A pergunta inicial é: "Trata-se de remover os detalhes para sempre, esquecê-los temporariamente ou mesmo utilizá-los de alguma maneira sem saber disso?"
mlvljr
1
Eu não ligo para quantos fótons atingiram meus clientes hoje.
Flamingpenguin
0

Para mim, abstração é algo que não existe "literalmente", é algo como uma idéia. Se você o expressa matematicamente, não é mais abstrato porque a matemática é uma linguagem para expressar o que acontece no seu cérebro, para que possa ser entendido pelo cérebro de outra pessoa, para que você não possa estruturar suas idéias, porque, se o fizer, não é uma ideia. mais: você precisaria entender como um cérebro funciona para expressar um modelo de idéia.

Abstração é algo que permite interpretar a realidade em algo que pode ser independente dela. Você pode abstrair uma praia e um sonho, mas a praia existe, mas o sonho não. Mas você pode dizer que ambos existem, mas não é verdade.

A coisa mais difícil na abstração é encontrar uma maneira de expressá-la para que outras pessoas possam entendê-la e se transformar em realidade. Esse é o trabalho mais difícil, e realmente não pode ser feito sozinho: você precisa inventar um modelo relativo que funcione com suas idéias e que possa ser entendido por outra pessoa.

Para mim, abstração em linguagem de computador deveria ser o nome "matemático" do modelo, trata-se de reutilizar idéias que podem ser comunicadas e é uma enorme restrição em comparação ao que pode ser alcançado abstratamente.

Simplificando, os átomos estão próximos um do outro, mas eles não se importam. Um grande conjunto de moléculas organizadas em um ser humano pode entender que ele está ao lado de alguém, mas não consegue entender como, é exatamente como os átomos se posicionaram em algum padrão.

Um objeto que é governado por um conceito, em geral, não pode "entender" a si mesmo. É por isso que tentamos acreditar em Deus e por que temos dificuldade em entender nosso cérebro.

Posso receber minha medalha agora?

jokoon
fonte
0

Pergunta interessante. Não conheço uma única definição de abstração que seja considerada autoritativa quando se trata de programação. Embora outras pessoas tenham fornecido links para algumas definições de vários ramos da teoria ou matemática do CS; Eu gosto de pensar nisso de uma maneira semelhante à "superveniência", consulte http://en.wikipedia.org/wiki/Supervenience

Quando falamos de abstração em programação, estamos comparando essencialmente duas descrições de um sistema. Seu código é uma descrição de um programa. Uma abstração do seu código também seria uma descrição desse programa, mas em um nível "superior". É claro que você pode ter uma abstração de nível ainda mais alto da abstração original (por exemplo, uma descrição do programa em uma arquitetura de sistema de alto nível vs. a descrição do programa em seu design detalhado).

Agora, o que torna uma descrição "de nível superior" que outra. A chave é a "realização múltipla" - sua abstração do programa pode ser realizada de várias maneiras e em vários idiomas. Agora você pode dizer que também é possível produzir vários designs para um único programa - duas pessoas podem produzir dois designs diferentes de alto nível que descrevem com precisão o programa. A equivalência das realizações faz a diferença.

Ao comparar programas ou designs, você deve fazê-lo de uma maneira que permita identificar as principais propriedades da descrição nesse nível. Você pode se deparar com maneiras complicadas de dizer que um design é equivalente a outro, mas a maneira mais fácil de pensar é: um único programa binário pode satisfazer as restrições de ambas as descrições?

Então, o que torna um nível de descrição mais alto que o outro? Digamos que temos um nível de descrição A (por exemplo, documentos de design) e outro nível de descrição B (por exemplo, código fonte). A é um nível mais alto que B porque se A1 e A2 são duas descrições não equivalentes no nível A, então as realizações dessas descrições, B1 e B2 devem também ser não equivalentes no nível B. No entanto, o inverso não é necessariamente verdadeiro .

Portanto, se eu não puder produzir um único programa binário que satisfaça dois documentos de design distintos (ou seja, as restrições desses designs se contradizem), o código-fonte que implementa esses designs deve ser diferente. Mas, por outro lado, se eu pegar dois conjuntos de códigos-fonte que não podem ser compilados no mesmo programa binário, ainda pode ser o caso de os binários resultantes da compilação desses dois conjuntos de códigos-fonte satisfazerem o mesmo design documento. Portanto, o documento de design é uma "abstração" do código fonte.

wahbedahbe
fonte
0

Abstrações de programação são abstrações feitas por alguém em um elemento programático. Digamos que você saiba como criar um menu com seus itens e outras coisas. Então alguém viu aquele trecho de código e pensamento, ei, que poderia ser útil em outros tipos de estruturas semelhantes a hireachy, e definiu o Component Design Pattern com uma abstração do primeiro trecho de código.

Padrões de Design Orientado a Objetos são um bom exemplo do que é abstração, e não quero dizer a implementação real, mas a maneira como devemos abordar uma solução.

Então, para resumir, programar abstração é uma abordagem que nos permite entender um problema, é o meio de obter algo, mas não é a coisa real

guiman
fonte