Confuso sobre a definição de 'abstração' em OOP

16

Estou tentando entender a definição de 'abstração' no OOP.

Eu encontrei algumas definições principais. Eles são todos válidos? Um deles está errado? Estou confuso. (Reescrevi a definição com minhas próprias palavras).

Definição 1:

Abstração é o conceito de pegar um objeto do mundo real e convertê-lo em termos de programação. Tal como a criação de uma Humanclasse e dando-lhe int health, int age, String name, etc. propriedades, e eat()métodos etc.

Definição 2:

Uma definição mais geral. Abstração é um conceito que ocorre em qualquer lugar de um sistema de software onde está envolvido 'tornar as coisas mais gerais / mais simples / abstratas' . Alguns exemplos:

  • Uma hierarquia de herança, onde as classes mais altas são mais simples ou mais gerais e definem uma implementação mais geral e abstrata. Enquanto as classes mais baixas na hierarquia são mais concretas e definem implementações mais detalhadas.

  • Usar o encapsulamento para ocultar os detalhes da implementação de uma classe de outras classes, tornando a classe mais 'abstrata' (mais simples) para o mundo externo do software.

Definição 3

Outra definição geral: Abstração é o conceito de mudar o foco dos detalhes e da implementação concreta de coisas, para os tipos de coisas (por exemplo, classes), as operações disponíveis (por exemplo, métodos), etc., tornando a programação mais simples, mais geral, e mais abstrato. (Isso pode ocorrer em qualquer lugar e em qualquer contexto do sistema de software). Ocorre, por exemplo, ao encapsular, porque encapsular significa ocultar os detalhes da implementação e mostrar apenas os tipos de coisas e suas definições mais gerais e abstratas. Outro exemplo seria usar um Listobjeto em Java. esse objeto realmente usa os detalhes de implementação de um ArrayListou a LinkedList, mas essas informações são abstraídas usando o nome mais geral List.

Alguma dessas definições está correta? (Estou me referindo à definição mais convencional e aceita ).

Aviv Cohn
fonte
A abstração está definindo uma "coisa" como um certo TIPO de coisa (Animal => Cachorro), a fim de reduzi-la ainda mais (Dog => Poodle).
Christine

Respostas:

22

A abstração é um dos três pilares da Programação Orientada a Objetos (OOP). Significa literalmente perceber uma entidade em um sistema ou contexto de uma perspectiva específica. Coletamos detalhes desnecessários e focamos apenas nos aspectos necessários para esse contexto ou sistema em consideração.

Aqui está uma boa explicação:

Você, como pessoa, tem diferentes relacionamentos em diferentes papéis. Quando você está na escola, você é um "aluno" . Quando você está no trabalho, é um "funcionário" . Quando você está na instituição do governo, pode ser visto como um "Cidadão" . Então, tudo se resume ao que em que contexto estamos olhando para uma entidade / objeto. Portanto, se estiver modelando um sistema de folha de pagamento , considerarei você um funcionário (PRN, período integral / meio período, designação) . Se estiver modelando um sistema de inscrição no curso , considerarei seus aspectos e características como aluno (número do rolo, idade, sexo, curso matriculado) . E se estou modelando um Sistema de Informações de Seguridade Socialentão analisarei seus dados como cidadão (como DOB, sexo, país de nascimento etc.)

Lembre-se de que Abstração (focando nos detalhes necessários) é diferente de Encapsulamento (ocultando detalhes do mundo exterior). Encapsulamento significa ocultar os detalhes do objeto e fornecer uma interface decente para as entidades do mundo exterior interagirem com esse objeto ou entidade. Por exemplo, se alguém quiser saber meu nome, ele não poderá acessar diretamente minhas células cerebrais para saber qual é o meu nome. Em vez disso, essa pessoa perguntará meu nome. Se um motorista deseja acelerar um veículo, existe uma interface (pedal do acelerador, marcha, etc.) para esse fim.

A primeira definição não é muito clara. Def 2 é bom, mas tende a confundir o novato, ao tentar vincular Abstração com Encapsulamento e Herança. Def 3 é a melhor das 3 definições, pois define claramente o que é Abstração com precisão.

Maxood
fonte
3
Então você diria que é como uma generalização em vez de uma especificação?
Robert Rocha
1
@samyismyhero Exatamente! Procuramos atributos genéricos e comportamento de objetos para abstração.
Maxood 7/01/15
[Animal => Cachorro] é uma abstração. Você define quais partes possíveis um "Animal" pode ter para criar um "Cão". (Cauda, ​​pernas, pêlo, etc). Então, você pode usar a classe "Dog" para definir um Poodle, Pit Bull, etc. Então, você está declarando raças de cães com base na classe "Dog" em vez de em um "Animal".
Christine
3

Definitivamente, a definição 1 não é uma abstração. Isso está descrevendo mais de perto a modelagem .

As definições 2 e 3 descrevem a mesma coisa. E ambos são boas descrições de uma abstração.

Eufórico
fonte
Isso foi o que eu pensei! abstract class Shaperi muito!
Robert Rocha
2

Cada uma dessas definições está correta.

A abstração é onde você se concentra apenas nos detalhes importantes para o seu propósito.

No primeiro caso, você (atualmente) não pode incluir pessoas reais no seu código; você se concentra nos detalhes específicos de uma pessoa que serve ao seu propósito. Em outro programa, você pode precisar se concentrar em detalhes diferentes. Essas seriam abstrações diferentes de uma pessoa e cada uma pode ser igualmente válida em seu contexto .

A segunda e terceira definições continuam essa idéia, aplicando-a a entidades de software.

andy256
fonte