O que é abstração? [fechadas]

37

Existe uma definição geralmente acordada sobre o que é uma programação abstração , como usado por programadores? [Note que a 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?

    
por mlvljr 01.11.2010 / 18:11
fonte

24 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ê quiser uma boa definição: a abstração é o processo de passar de uma ideia específica para uma mais geral. Por exemplo, dê uma olhada no seu mouse. É sem fio? Que tipo de sensor tem? Quantos botões? É ergonômico? Quão grande é isso? As respostas para todas essas perguntas podem descrever precisamente o mouse, mas, independentemente de quais sejam as respostas, ainda é um mouse, porque é um dispositivo apontador com botões. É tudo o que é preciso para ser um rato. "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 - é um Apple Magic Mouse ou um Mouse Óptico da Dell ou um Microsoft IntelliMouse - "mouse" é apenas um conceito abstrato.

A abstração pode ser em camadas e tão fina ou grossa quanto desejar (um MX518 é um mouse, que é um objeto apontador, que é um periférico de computador, que é um objeto alimentado por eletricidade), pode ir tão longe como você quer, e em praticamente qualquer direção que você quiser (meu mouse tem um fio, o que significa que eu poderia categorizá-lo como um objeto com um fio. Ele também é plano na parte inferior, então eu poderia categorizá-lo como um tipo de objeto que ganhou) t rolar 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. Boa OOP significa escolher boas abstrações no nível apropriado de detalhe 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 faz inventários de equipamentos de informática, mas pode fazer sentido para um simulador de física. O último significa que você deve tentar 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 todos os periféricos 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 de círculo-elipse é o exemplo mais conhecido desse enigma.

    
por 01.11.2010 / 19:41
fonte
25

Eu discordo categoricamente da maioria das respostas.

Esta é minha resposta:

Given two sets G and H, a Galois connection (alpha, beta) can be defined between them, and one can be said to be a concretization of the other; reverse the connection, and one is an abstraction of the other. The functions are a concretization function and an abstraction function.

Isto é a partir da teoria da interpretação abstrata de programas de computador, que normalmente é uma abordagem de análise estática até à data.

    
por 01.11.2010 / 23:48
fonte
13

A abstração é mais focada em What e menos em How . Ou você pode dizer, saber apenas as coisas que você precisa, e apenas confiar no provedor para todos os outros serviços. Às vezes até esconde 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. Como se o site foi desenvolvido com o asp.net mvc ou Python, se isso é executado em um servidor Windows ou Linux, etc Porque isso não é da nossa conta. Portanto, este site está mantendo uma camada de abstração sobre seu mecanismo subjacente para fornecermos o serviço.

Alguns outros exemplos:

  • Um carro esconde todos os seus mecanismos, mas fornece uma maneira de dirigir, reabastecer e manter o proprietário.

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

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

  • Ao usar um objeto do tipo de um Interface ou um abstract class em Java ou C ++, a implementação real é ocultada. E não apenas ocultas, as implementações dos métodos declarados no Interface provavelmente também serão diferentes em várias classes implementadas / herdadas. Mas como você está recebendo o mesmo serviço, apenas não se preocupe How é implementado e exatamente Who / What está fornecendo o serviço.

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

por 01.11.2010 / 18:57
fonte
7

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

Por exemplo, uma conexão TCP / IP é uma abstração sobre o envio de dados. Você simplesmente inclui um endereço IP e um número de porta e envia-o para a API. Você não está preocupado com todos os detalhes dos fios, sinais, formatos de mensagens e falhas.

    
por 01.11.2010 / 18:25
fonte
7

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

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

Na programação funcional, a idéia de um programa como uma instrução matemática é muito strong, e muitas vezes o sistema de tipos (em uma linguagem strong e estaticamente tipificada como Haskell, F # ou OCAML) pode ser usado para testar a condição através de provas.

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

Agora vamos supor que queremos multiplicação, e nossos primitivos (por questão de brevidade) incluem uma construção em loop e um meio de designar referências simbólicas. Podemos 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 multiplicação para fazer mais coisas com meu sistema (a linguagem de programação).

Eu também posso verificar meu sistema de tipos. (*) tem um tipo de int - > int - > int. Leva 2 ints e gera um int. Adição tem um tipo de int - > int - > int então o 0 + (resto) aguenta enquanto (resto) resultar em um int. Meu loop poderia estar fazendo todo tipo de coisas, mas estou dizendo que gera uma cadeia de funções curried de tal forma que (x + (x + (x ... + 0))) é o resultado. A forma dessa cadeia de adição é justa (int - > (int - > (int ... - > int))) então eu sei que minha saída final será um int. Então meu sistema de tipos reteve os resultados da minha outra prova!

Compõe este tipo de ideia ao longo de muitos anos, muitos programadores e muitas linhas de código, e você tem linguagens de programação modernas: um conjunto de primitivas e enormes bibliotecas de abstrações de código "comprovadas".

    
por 01.11.2010 / 19:29
fonte
4

A resposta da Wikipédia seria boa o suficiente? link

In computer science, the mechanism and practice of abstraction reduces and factors out details so that one can focus on a few concepts at a time.

    
por 01.11.2010 / 18:24
fonte
4

Bem, matematicamente, "inteiro" é uma abstração. E quando você faz provas formais como x + y = y + x para todos os inteiros, você está trabalhando com a abstração "integer" ao invés de números específicos como 3 ou 4. Isso acontece no desenvolvimento de software quando você interage com o máquina em um nível acima de registros e locais de memória. Você pode pensar em pensamentos mais poderosos em um nível mais abstrato, na maioria dos casos.

    
por 01.11.2010 / 18:44
fonte
4

Você está recebendo boas respostas aqui. Eu apenas aconselharia - as pessoas acham que a abstração é de alguma forma essa coisa maravilhosa que precisa ser colocada em um pedestal, e que você não pode ter o suficiente. Não é. É apenas senso comum. É apenas reconhecer as semelhanças entre as coisas, para que você possa aplicar uma solução de problema a uma série de problemas.

Permita-me sofrer ...

No topo da minha lista de aborrecimentos é 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 eles não gostam, e os chamam de "mais abstratos", como se isso os tornasse melhores. Lembre-se da fábula da "Princesa e a Ervilha"? A princesa era tão delicada que, se houvesse uma ervilha debaixo do colchão, não conseguiria dormir, e acrescentar mais camadas de colchão 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 propagada por várias camadas de código.

    
por 02.11.2010 / 02:46
fonte
4

Acho que você pode encontrar uma postagem no meu blog abstrações úteis. Aqui está o histórico relevante:

Abstração é um mecanismo para ajudar a pegar 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 represente esse conceito abstrato. Essa nova construção (virtualmente) sempre tem parametrizações : um meio de personalizar o uso da construção para atender às suas necessidades específicas.

Por exemplo, uma classe List pode abstrair os detalhes de uma implementação de lista vinculada - onde, em vez de pensar em termos de manipulação de next e previous ponteiros, você pode pensar no nível de adição ou removendo valores para 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 são frequentemente mal compreendidos.

No exemplo List , encapsulamento pode ser usado para ocultar os detalhes da implementação de uma lista encadeada; em uma linguagem orientada a objetos, por exemplo, você pode tornar os next e previous ponteiros privados, onde somente a implementação de 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 dos construtos. Se todas as classes List tivessem dado a você métodos de acesso de estilo ' getNext ' / ' setNext ', ela seria encapsulada a partir dos detalhes de implementação (por exemplo, você nomeou o campo ' prev ' ou ' previous '? qual era seu tipo estático?), mas teria um grau muito baixo de abstração.

Modularidade diz respeito à 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 mudanças, porque outros módulos dependem apenas da interface estável.

O ocultamento de informações é auxiliado pelo encapsulamento (para que seu código não dependa de detalhes de implementação instáveis), mas o encapsulamento não é necessário para modularidade. Por exemplo, você pode implementar uma estrutura List em C, expondo os ponteiros ' next ' e ' prev ' para o mundo, mas também fornecer uma interface contendo initList() , addToList() e removeFromList() 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 clássico trabalho da Parnas sobre modularidade, por exemplo, foi escrito com um exemplo em assembly. A interface é um contrato e uma forma de comunicação sobre o design, não precisa necessariamente ser verificada mecanicamente, embora seja nisso que dependemos hoje.]

Embora termos como resumo, modular e encapsulado sejam usados como descrições de design positivas, é 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á um desempenho pior do que um algoritmo n log n melhorado.

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

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

por 09.11.2010 / 06:15
fonte
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, eu acho que você está sem sorte - 'abstração' é um termo de arquitetura / design de software, e não tem nenhum suporte matemático para ele, até onde eu saiba (talvez alguém melhor versado em CS teórico vai me corrigir aqui), mais do que "acoplamento" ou "esconder informação" tem definições matemáticas.

    
por 01.11.2010 / 19:28
fonte
2

A 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 uma abstração, já que necessariamente exigiria que a coisa subjacente fosse resumida em um conjunto de propriedades matemáticas! A noção de teoria de categoria de um morfismo é provavelmente mais próxima do que você está procurando.

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

    
por 15.12.2010 / 06:08
fonte
2

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

Abstraction in computer programming is the act of generalizing something to the point that more than one similar thing can be generally treated as the same and handled the same.

Se você quiser expandir isso, adicione:

Sometimes this is done to achieve polymorphic behavior (interfaces and inheritance) to cut down on repetitive code up front, other times it is done so that the inner workings of something could be replaced at a future date with a similar solution without having to alter the code on the other side of the abstracted container or wrapper, hopefully cutting down on rework in the future.

Além disso, acho que você precisa começar com exemplos ...

    
por 15.12.2010 / 23:02
fonte
1

Você pode querer verificar algumas das métricas de Bob Martin

link

Dito isto, não acho que a "abstracção" seja igual à sua. Sua é 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 tocam mais no que você está procurando.

    
por 01.11.2010 / 19:31
fonte
1

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

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

Muitas vezes, as abstrações são definidas em termos de construções matemáticas. Isso é provavelmente porque eles são tão usados em ciência e engenharia.

Um exemplo é a mecânica newtoniana. Assume que tudo é infinitesimalmente pequeno e 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 é típico de elementos de circuito linear, 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és simples, e outras coisas, a análise de RLC funciona bem e fornece resultados muito bons. Mas outras situações, como circuitos de rádio de micro-ondas, os elementos são muito grandes e as interações são mais sutis, e as abstrações de RLC simples não se sustentam. O que fazer nesse ponto depende do julgamento do engenheiro. Alguns engenheiros criaram outra abstração sobre os outros, alguns substituindo os amplificadores operacionais ideais por novas fórmulas matemáticas de como funcionam, outros substituem amplificadores operacionais ideais por amplificadores operacionais reais simulados, que por sua vez são simulados com uma rede complexa de elementos ideais.

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

    
por 01.11.2010 / 20:26
fonte
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 nos comunicarmos. 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-chave de uma abstração é que a entidade em questão é distinta da representação subjacente, assim como uma palavra não é os sons que são usados para expressá-la ou as letras que são 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 é totalmente distinta da representação subjacente e, às vezes, a representação " vazamentos " . Por exemplo, a fala carrega tons emocionais que são muito difíceis de transmitir por escrito. Por causa disso, uma gravação de áudio e uma transcrição das mesmas palavras podem ter um efeito muito diferente sobre o público. Em outras palavras, a abstração de palavras geralmente vaza.

As 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 por sua vez abstrações do padrão de movimento das partículas de ar que são criadas pelas cordas vocais e que são detectadas pelos tímpanos de uma pessoa. .

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 da 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. Então, funções e classes (assumindo uma linguagem OO) que são implementadas em termos de tipos de dados primitivos e instruções de linguagem incorporadas. Então, 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 ou uma lista de funcionários ou uma tabela de hash de títulos de livros. . Neste esquema de coisas, cada nível é uma abstração em relação ao seu antecessor.

    
por 01.11.2010 / 19:54
fonte
1

Uma maneira que eu tento descrever para as pessoas, pode não ser a melhor maneira

Considere um programa que adicione 2 + 2 e produza 4

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

Qual é mais útil e geral?

    
por 02.11.2010 / 03:02
fonte
1

Eu diria que uma abstração é algo que esconde 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 quando estou lendo esses dados de um arquivo. Então eu crio uma função save_to_database.

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

    
por 02.11.2010 / 03:29
fonte
1

Eu sempre penso em abstração em programação como esconder detalhes e prover 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, em seguida, fornecer uma interface simples para usar a solução. Então você pode com efeito "esquecer" os detalhes. Isso é importante porque não há como uma pessoa manter todos os detalhes de um sistema super complexo em suas mentes de uma só vez. Isso não quer dizer que os detalhes sob a abstração nunca terão que ser revisitados, mas, por enquanto, apenas a interface deve ser lembrada.

Na programação, essa interface simplificada pode ser qualquer coisa 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 única chamada de linha) para uma classe e além .

No final, o trabalho principal dos programadores é geralmente abstrair todos os detalhes computacionais e fornecer uma interface simples como uma GUI que alguém que não saiba uma coisa sobre como os computadores funcionam pode usar.

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

  • Permite que um grande problema seja dividido em partes gerenciáveis. Ao adicionar os registros de uma pessoa a um banco de dados, você não precisa estar mexendo com a inserção e o balanceamento de árvores de índice no banco de dados. Este 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 ter que conhecer todos os detalhes do código do meu colega. Eu só quero saber como usá-lo, o que ele faz e como combiná-lo com o meu trabalho (a interface).

  • Permite que pessoas que não possuem o conhecimento necessário executem uma tarefa complexa para isso. Minha mãe pode atualizar seu facebook e as pessoas que ela conhece em todo o país podem ver. Sem a abstração de um sistema insanamente complexo para uma interface web simples, não há como ela ser capaz de começar a fazer algo semelhante (nem eu mesmo).

A abstração pode, no entanto, ter o efeito inverso de tornar as coisas menos manejáveis se for usada em excesso. Ao dividir um problema em muitos pequenos pedaços, 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.

    
por 14.12.2010 / 17:35
fonte
1

Um nível extra de indireção.

Você não quer saber se o objeto que está usando é um Cat ou um Dog , então você passa por uma tabela de função virtual para encontrar a função makeNoise() correta.

Eu tenho certeza que isso poderia ser aplicado a níveis "inferiores" e "altos" também - pense em um compilador procurando a instrução correta para usar em um determinado processador ou o resumo de Monad s de Haskell sobre efeitos computacionais chamando tudo return e >>= .

    
por 14.12.2010 / 21:58
fonte
1

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

Abstraction in programming is about understanding the essence of an object within a given context.

[...]

Abstraction is not only mistaken with generalization, but also with encapsulation, but these are the two orthogonal parts of information hiding: The service module decides what it is willing to show and the client module decides what it is willing to see. Encapsulation is the first part and abstraction the latter. Only both together constitute full information hiding.

Espero que ajude.

    
por 16.12.2010 / 15:38
fonte
0

Aqui, uma resposta não matemática:

Abtracting afastado na programação é fingir que você não se importa com os detalhes agora, enquanto na verdade você faz e você deve se preocupar com eles o tempo todo. É basicamente fingir.

    
por 05.11.2010 / 23:49
fonte
0

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

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ê poderia dizer que ambos existem, mas não é verdade.

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

Para mim, a abstração na linguagem de computador deve 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 com o que pode ser alcançado abstratamente.

Simplificando, os átomos estão próximos uns dos outros, 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 pode entender como, é como os átomos se posicionam em algum padrão.

Um objeto que é regido 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?

    
por 16.12.2010 / 12:25
fonte
0

Pergunta interessante. Eu não sei de uma única definição de abstração que é considerada autoritativa quando se trata de programação. Embora outras pessoas tenham fornecido links para algumas definições de vários ramos da teoria da CS ou matemática; Eu gosto de pensar de forma semelhante a "superveniência", veja link

Quando falamos de abstração em programação, estamos essencialmente comparando 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ê poderia ter uma abstração de nível ainda maior de sua abstração original (por exemplo, uma descrição do programa em uma arquitetura de sistema de alto nível versus a descrição do programa em seu design detalhado).

Agora, o que faz uma descrição "de nível mais alto" do que outra. A chave é "múltipla realizabilidade" - sua abstração do programa pode ser percebida de várias maneiras em vários idiomas. Agora você pode dizer que também é possível produzir múltiplos projetos 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 projetos, você deve fazê-lo de uma maneira que permita identificar as principais propriedades da descrição nesse nível. Você pode entrar em maneiras complicadas de dizer que um design é equivalente a outro, mas a maneira mais fácil de pensar sobre isso é: 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 tenhamos um nível de descrição A (por exemplo, documentos de projeto) e outro nível de descrição B (por exemplo, código-fonte). A é nível superior a 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 não serem equivalentes no nível B. No entanto, reverso 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ódigo-fonte que não poderiam ser compilados no mesmo programa binário, ainda assim poderia acontecer que os binários resultantes da compilação desses dois conjuntos de código-fonte satisfaçam o mesmo design. documento. Assim, o documento de design é uma "abstração" do código-fonte.

    
por 17.12.2010 / 19:21
fonte
0

Abstrações de programação são abstrações feitas por alguém em um elemento programático. Vamos dizer que você sabe como construir um menu com itens e coisas. Então alguém viu esse pedaço de código e pensou, ei que poderia ser útil em outro tipo de estruturas semelhantes a hireachy, e definiu que o Component Design Pattern é uma abstração do primeiro pedaço de código.

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

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

    
por 18.12.2010 / 03:58
fonte