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?
terminology
abstraction
mlvljr
fonte
fonte
Respostas:
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.
fonte
Eu discordo categoricamente da maioria das respostas.
Esta é a minha resposta:
Isso é da teoria da interpretação abstrata de programas de computador, que normalmente é uma abordagem de análise estática até o momento.
fonte
Abstração é mais foco
What
e menosHow
. 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
Interface
ou anabstract class
em 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,How
ele é implementado e exatamenteWho
/What
está 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.
fonte
How
sempre é útil para entender osWhat
. Assim, pode ser misturado com abstração.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.
fonte
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
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".
fonte
A resposta da Wikipedia seria boa o suficiente? http://en.wikipedia.org/wiki/Abstraction_%28programming%29
fonte
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.
fonte
IInt add(IInt a, IInt b);
sub-rotina em um programa onde você sabe de antemão quea
eb
será, digamos,Int128: IInt
mais 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)?add(int, int)
sub - rotina / função. Será suficiente tê-lo exatamentereturn 2 + 3;
neste caso. E por que você deveria usar uma rotina mais "universal" (return a + b;
ou seja, operar com quaisquer parâmetros reaisa
eb
fornecidos e, portanto, verdadeiramente abstratos de seus valores) - essa foi minha pergunta (retórica) acima. Espero que tenha ficado um pouco mais claro agora.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.
fonte
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
List
classe pode abstrair os detalhes de uma implementação de lista vinculada - onde, em vez de pensar em termos de manipulaçãonext
eprevious
ponteiros, 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
List
exemplo, 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 ponteirosnext
eprevious
privados, 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
List
classe 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
List
estrutura em C, expondo os 'next
' e 'prev
ponteiros' para o mundo, mas também proporcionar uma interface, que contéminitList()
,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.
fonte
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.
fonte
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 .
fonte
Como forma de explicar isso a outra pessoa, eu faria o contrário, a partir dos resultados anteriores:
Se você quiser expandir isso, pode adicionar:
Além disso, acho que você tem que começar em exemplos ...
fonte
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.
fonte
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.
fonte
Employer
as suposições deEmployee
).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. .
fonte
int
menor 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ótipovoid (*) (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 vazaUma 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?
fonte
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.
fonte
save_to_database
nã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.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.
fonte
Um nível extra de indireção.
Você não quer se importar se o objeto que está usando é um
Cat
ou umDog
, 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
Monad
resumo de Haskell sobre os efeitos computacionais chamando tudoreturn
e>>=
.fonte
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:
[...]
Espero que ajude.
fonte
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.
fonte
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?
fonte
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.
fonte
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
fonte