Abstração versus ocultação de informações vs encapsulamento

167

Você pode me dizer qual é a diferença entre abstração e ocultação de informações no desenvolvimento de software?

Estou confuso. A abstração oculta a implementação de detalhes e a ocultação de informações abstrai todos os detalhes de algo.

Atualização: Encontrei uma boa resposta para esses três conceitos. Veja a resposta separada abaixo para várias citações tiradas de .

popopome
fonte
"O encapsulamento é a técnica para empacotar as informações de forma a ocultar o que deve ser oculto e tornar visível o que se pretende que seja visível." ; lembrando que o encapsulamento é alcançado através da ocultação de informações.
Wulfgarpro #
citação torção quebrada
Rishi Dua 15/11

Respostas:

152

Vá para a fonte! Grady Booch diz (em Análise e Design Orientado a Objetos, página 49, segunda edição):

Abstração e encapsulamento são conceitos complementares: a abstração se concentra no comportamento observável de um objeto ... o encapsulamento se concentra na implementação que dá origem a esse comportamento ... o encapsulamento geralmente é alcançado através da ocultação de informações, que é o processo de ocultar todos os objetos. os segredos do objeto que não contribuem para suas características essenciais.

Em outras palavras: abstração = o objeto externamente; encapsulamento (alcançado através da ocultação de informações) = o objeto internamente,

Exemplo: No .NET Framework, a System.Text.StringBuilderclasse fornece uma abstração sobre um buffer de cadeia de caracteres. Essa abstração de buffer permite trabalhar com o buffer sem levar em consideração sua implementação. Assim, você pode anexar seqüências de caracteres ao buffer, sem levar em consideração como o StringBuildermonitor controla internamente coisas como o ponteiro para o buffer e gerenciar a memória quando o buffer fica cheio (o que ocorre com o encapsulamento via ocultação de informações).

rp

rp.
fonte
5
você diria que, da mesma forma que abstração e encapsulamento são complementares, encapsulamento e ocultação de informações também são complementares? Claro, o encapsulamento é alcançado através da ocultação de informações, mas ... o encapsulamento não é o mecanismo pelo qual a ocultação de informações é realizada?
Wulfgarpro 17/09/11
Outro exemplo do mundo real para a definição de Booch está disponível aqui
lifebalance
Você poderia me dizer se seria correto dizer que a abstração é melhor compreendida pela perspectiva do código do cliente, enquanto o encapsulamento é melhor compreendido pela perspectiva do código de serviço (ou seja, a própria classe encapsulada)?
user1338998
O exemplo do mundo real para a definição acima é explicado aqui: stackoverflow.com/a/635755/3181500
user3181500
84

O OP atualizou sua pergunta com várias citações que ele havia encontrado, a saber em um artigo de Edward V. Berard intitulado "Abstração, encapsulamento e ocultação de informações" . Estou publicando novamente uma versão um pouco expandida e reformatada da atualização do OP, pois ela deve ser uma resposta por si só.

(Todas as citações são retiradas do artigo mencionado acima.)

Abstração:

"Um ponto de confusão em relação à abstração é seu uso como processo e como entidade. Abstração, como um processo, denota a extração de detalhes essenciais sobre um item ou um grupo de itens, ignorando os detalhes não essenciais. Abstração, como um entidade, denota um modelo, uma exibição ou alguma outra representação focada para um item real ".

Ocultar informações:

"Sua interface ou definição foi escolhida para revelar o mínimo possível sobre seu funcionamento interno". - [Parnas, 1972b]

"A abstração pode ser [...] usada como uma técnica para identificar quais informações devem ser ocultadas".

"A confusão pode ocorrer quando as pessoas não conseguem distinguir entre ocultar as informações e uma técnica (por exemplo, abstração) usada para ajudar a identificar quais informações devem ser ocultadas".

Encapsulamento:

"Refere-se à construção de uma cápsula, no caso uma barreira conceitual, em torno de alguma coleção de coisas". - [Wirfs-Brock et al, 1990]

"Como processo, encapsulamento significa o ato de incluir um ou mais itens em um contêiner [...]. O encapsulamento, como entidade, refere-se a um pacote ou invólucro que contém (contém, encerra) um ou mais itens."

"Se o encapsulamento fosse 'a mesma coisa que ocultar informações', seria possível argumentar que 'tudo o que foi encapsulado também estava oculto'. Obviamente isso não é verdade. "

Conclusão:

"Abstração, ocultação de informações e encapsulamento são conceitos muito diferentes, mas altamente relacionados. Pode-se argumentar que a abstração é uma técnica que nos ajuda a identificar quais informações específicas devem estar visíveis e quais informações devem ser ocultadas. O encapsulamento é a técnica para empacotar as informações de forma a ocultar o que deve ser oculto e tornar visível o que se pretende que seja visível. "

stakx
fonte
ótima explicação praticamente. seria ótimo fornecer exemplos concretos em java. parece-me que setter / getter em esconder java a implementação, portanto, alcançar Information Hiding(ou esconderijo de implementação), enquanto que um genérico classalcança encapsulamento e abstração é conseguido através de privateacesso
abarik
57

Abstraction está ocultando os detalhes da implementação, fornecendo uma camada sobre a funcionalidade básica.

Information Hidingestá ocultando os dados que estão sendo afetados por essa implementação. O uso privatee publicvem com isso. Por exemplo, ocultando as variáveis ​​das classes.

Encapsulationestá apenas colocando todos os dados e funções semelhantes em um grupo, por exemplo, Classna programação; Packetem rede.

Através do uso de Classes, vamos implementar todos os três conceitos - Abstraction, Information HidingeEncapsulation

Shashwat
fonte
33

Por favor, não complique conceitos simples.

Encapsulamento : agrupar dados e métodos em uma única unidade é encapsulamento (por exemplo, classe)

Abstração : É um ato de representar apenas as coisas essenciais sem incluir detalhes do plano de fundo. (por exemplo, interface)

PARA EXEMPLOS E MAIS INFORMAÇÕES GOTO:

http://thecodekey.com/C_VB_Codes/Encapsulation.aspx

http://thecodekey.com/C_VB_Codes/Abstraction.aspx

Definições aprovadas aqui

PS: Também me lembro da definição de um livro chamado C ++ de Sumita Arora que lemos na 11ª classe;)

Rashy
fonte
6

O significado da abstração dado pelo Oxford English Dictionary (OED) mais próximo do significado pretendido aqui é 'O ato de separar no pensamento'. Uma definição melhor pode ser 'Representando os recursos essenciais de algo sem incluir detalhes de segundo plano ou detalhes não essenciais'.

Ocultar informações é o princípio de que os usuários de um componente de software (como uma classe) precisam conhecer apenas os detalhes essenciais de como inicializar e acessar o componente, e não precisam conhecer os detalhes da implementação.

Edit : Parece-me que a abstração é o processo de decidir quais partes da implementação devem ser ocultadas .

Portanto, não é abstração VERSUS ocultação de informações. São informações ocultando VIA abstração.

interferência
fonte
4

Abstração

Abstração é um ato de representar detalhes essenciais, sem incluir os detalhes do plano de fundo. Uma classe abstrata possui apenas assinaturas de métodos e a classe de implementação pode ter sua própria implementação, dessa maneira os detalhes complexos serão ocultados ao usuário. A abstração se concentra na visão externa. Em outras palavras, Abstração é a separação de interfaces da implementação real.

Encapsulamento

O encapsulamento explica a ligação dos membros e métodos dos dados em uma única unidade. Ocultar informações é o principal objetivo do encapsulamento. O encapsulamento é obtido usando especificadores de acesso como privado, público e protegido. As variáveis ​​de membro da classe são tornadas privadas para que não possam ser acessíveis diretamente ao mundo externo. O encapsulamento se concentra na visão interna. Em outras palavras, Encapsulamento é uma técnica usada para proteger as informações em um objeto do outro objeto.

Harleen
fonte
3

A abstração está ocultando detalhes da implementação como você o coloca.

Você abstrai algo a um ponto alto o suficiente para ter que fazer algo muito simples para executar uma ação.

Ocultar informações está ocultando detalhes de implementação. A programação é difícil. Você pode ter muitas coisas para lidar e lidar. Pode haver variáveis ​​que você deseja / precisa acompanhar de perto. Ocultar informações garante que ninguém quebre acidentalmente algo usando uma variável ou método que você expôs publicamente.

Esses dois conceitos estão intimamente ligados na programação orientada a objetos.

Dan Herbert
fonte
3

Abstração - É o processo de identificar as características essenciais de um objeto sem incluir os detalhes irrelevantes e tediosos.

Encapsulamento - É o processo de inclusão de dados e funções que manipulam esses dados em uma única unidade.

Abstração e encapsulamento são conceitos relacionados, mas complementares.

  1. Abstração é o processo. Encapsulamento é o mecanismo pelo qual a Abstração é implementada.

  2. A abstração se concentra no comportamento observável de um objeto. O encapsulamento se concentra na implementação que dá origem a esse comportamento.

Ocultar informações - é o processo de ocultar os detalhes de implementação de um objeto. É um resultado do encapsulamento.

Aatish Agarwal
fonte
2

Encapsulamento: ligar os membros de dados e as funções de membro é chamado de encapsulamento. o encapsulamento é feito através da classe abstração: ocultar os detalhes da implementação do uso ou da visualização é chamado abstração. ex: int x; não sabemos como o int funcionará internamente. mas sabemos que int funcionará. isso é abstração.

Siva Prasad
fonte
2

Abstração: Abstração é o conceito / técnica usada para identificar qual deve ser a visão externa de um objeto. Disponibilizando apenas a interface necessária.

Ocultar informações: É complementar à abstração, pois através da ocultação de informações é obtida. Escondendo tudo o resto, exceto a visão externa.

Encapsulamento: vincula dados e funções relacionadas a uma unidade. Facilita a abstração e a ocultação de informações. Permitir que recursos como acesso de membros sejam aplicados na unidade para obter ocultação de abstração e informações

Vikram
fonte
2

Veja o post de Joel sobre a Lei das Abstrações com Vazamento

JoelOnsoftware

Basicamente, abstrair oferece a liberdade de pensar em conceitos de nível superior. Uma analogia que não é de programação é que a maioria de nós não sabe de onde vem nossa comida ou como é produzida, mas o fato de que (geralmente) não precisamos nos preocupar com isso nos libera para fazer outras coisas, como programação.

Quanto à ocultação de informações, concordo com a interferência.

Jason Z
fonte
2

Em muito curto

Encapsulamento : - Esconder informações

Abstração : - Implementação oculta

Abstractionpermite que você se concentre what the object doesenquanto Encapsulation significahow an object works

Rahul Sharma
fonte
1

A abstração permite tratar um processo complexo como um processo simples. Por exemplo, a abstração "arquivo" padrão trata os arquivos como uma matriz contígua de bytes. O usuário / desenvolvedor nem precisa pensar em questões de clusters e fragmentação. (A abstração normalmente aparece como classes ou sub-rotinas.)

Ocultar informações é proteger suas abstrações contra usuários mal-intencionados / incompetentes. Ao restringir o controle de algum estado (alocações do disco rígido, por exemplo) ao desenvolvedor original, enormes quantidades de manipulação de erros se tornam redundantes. Se ninguém além do driver do sistema de arquivos puder gravar no disco rígido, o driver do sistema de arquivos saberá exatamente o que foi gravado no disco rígido e onde. (A manifestação usual desse conceito é privatee protectedpalavras - chave nos idiomas OO.)

Zooba
fonte
1

Para abstrair algo, precisamos ocultar os detalhes ou ocultar os detalhes de algo que precisamos abstrair. Mas, ambos podem ser alcançados por encapsulamento.

Portanto, ocultar informações é uma meta, abstração é um processo e encapsulamento é uma técnica.

Selo
fonte
Você pode fornecer um exemplo de Java para o mesmo?
precisa
1

Abstração significa simplesmente a técnica na qual apenas os detalhes essenciais do software são tornados visíveis para o usuário para ajudá-lo a usar ou operar com o software; portanto, os detalhes de implementação desse software não são mostrados (ficam invisíveis). Encapsulamento é a técnica que possui um pacote que contém um ou mais itens e, portanto, algumas informações (principalmente detalhes do programa) se tornaram visíveis e outras não visíveis para o usuário; portanto, o encapsulamento é alcançado através da ocultação de informações. Em suma. Abstração é para comportamento observável (externamente) e encapsulamento é para invisibilidade (internamente), mas esses dois são realmente complementares.

MOBITI MAHENGE
fonte
1

Apenas adicionando mais detalhes sobre InformationHiding , encontrado Este link é realmente uma boa fonte, com exemplos

InformationHiding é a ideia de que uma decisão de design deve ser ocultada do resto do sistema para evitar acoplamentos não intencionais. InformationHiding é um princípio de design. O InformationHiding deve informar a maneira como você encapsula as coisas, mas é claro que não precisa .

Encapsulamento é um recurso da linguagem de programação.

Abhijeet
fonte
1

Abstração e Encapsulamento são dois dos quatro conceitos básicos de POO que permitem modelar coisas do mundo real em objetos, para que você possa implementá-las em seu programa e código. Muitos iniciantes ficam confusos entre Abstração e Encapsulamento, porque ambos parecem muito semelhantes. Se você perguntar a alguém o que é Abstração, ele dirá que é um conceito de POO que se concentra em informações relevantes, ocultando detalhes desnecessários, e quando você pergunta sobre Encapsulamento, muitos dirão que é outro conceito de POO que oculta dados de outros países. As definições não estão erradas, pois a Abstração e o Encapsulamento ocultam algo, mas a principal diferença está na intenção.

A abstração oculta a complexidade, fornecendo uma imagem mais abstrata, uma espécie de visão de 10.000 pés, enquanto o Encapsulation oculta o trabalho interno para que você possa alterá-lo mais tarde. Em outras palavras, a abstração oculta detalhes no nível do design, enquanto o encapsulamento oculta os detalhes no nível da implementação.

Charith Perera
fonte
0

Depois de ler todas as respostas acima, uma a uma, não consigo parar de postar

abstração envolve a facilidade de definir objetos que representam "atores" abstratos que podem executar trabalhos, reportar e alterar seu estado e "se comunicar" com outros objetos no sistema.

O encapsulamento é bem claro de cima, no entanto ->

O termo encapsulamento refere-se à ocultação de detalhes do estado, mas estender o conceito de tipo de dados de linguagens de programação anteriores para associar o comportamento mais fortemente aos dados e padronizar a maneira como diferentes tipos de dados interagem é o início da abstração.

wiki de referência

user666
fonte
0

Eu também estava muito confuso sobre os dois conceitos de Abstração e Encapsulamento. Mas quando vi o artigo sobre abstração em myjavatrainer.com, ficou claro para mim que Abstração e Encapsulamento são Maçãs e Laranjas, você não pode realmente compará-las porque as duas são necessárias.

Encapsulamento é como o objeto é criado, e abstração é como o objeto é visualizado no mundo exterior.

Navin Israni
fonte
0

Encapsulamento: dados de ligação e os métodos que atuam sobre ele. isso permite ocultar dados de todos os outros métodos em outras classes. exemplo: MyListclasse que pode adicionar um item, remover um item, e remover todos os itens da métodos add, removee removeAllagir de acordo com a lista (uma matriz privada) que não pode ser acessado diretamente a partir do exterior.

Abstração: está ocultando dados e comportamento não relevantes. Como os itens são realmente armazenados, adicionados ou excluídos é oculto (abstraído). Meus dados podem ser mantidos em uma matriz simples, ArrayList, LinkedList e assim por diante. Além disso, como os métodos são implementados está oculto do lado de fora.

Ammar Samater
fonte
0

Encapsulamento - reforça o acesso aos dados internos de maneira controlada ou impede que os membros sejam acessados ​​diretamente.

Abstração - Ocultar os detalhes de implementação de certos métodos é conhecido como abstração

Vamos entender com a ajuda de um exemplo: -

class Rectangle
{
private int length;
private int breadth;// see the word private that means they cant be accesed from 
outside world.
 //now to make them accessed indirectly define getters and setters methods
void setLength(int length)
{  
// we are adding this condition to prevent users to make any irrelevent changes 
  that is why we have made length private so that they should be set according to 
   certain restrictions
if(length!=0)
{
 this.length=length
 }
void getLength()
{
 return length;
 }
 // same do for breadth
}

Agora, para abstração, defina um método que só possa ser acessado e o usuário não saiba qual é o corpo do método e como está funcionando. Vamos considerar o exemplo acima, podemos definir uma área de método que calcula a área do retângulo.

 public int area()
 {
  return length*breadth;
 }

Agora, sempre que um usuário usar o método acima, ele obterá a área e não a maneira como ela é calculada. Podemos considerar um exemplo do método println (), apenas sabemos que ele é usado para impressão e não sabemos como ele imprime os dados. Eu escrevi um blog em detalhes, você pode ver o link abaixo para obter mais informações abstração vs encapsulamento

Rohan Sharma
fonte
0

Vale a pena notar que esses termos padronizaram as definições do IEEE, que podem ser pesquisadas em https://pascal.computer.org/ .

abstração

  1. visualização de um objeto que se concentra nas informações relevantes para uma finalidade específica e ignora o restante das informações
  2. processo de formulação de uma visão
  3. processo de suprimir detalhes irrelevantes para estabelecer um modelo simplificado ou o resultado desse processo

ocultação de informações

  1. técnica de desenvolvimento de software na qual as interfaces de cada módulo revelam o mínimo possível sobre o funcionamento interno do módulo e outros módulos são impedidos de usar informações sobre o módulo que não estão na especificação de interface do módulo
  2. contenção de uma decisão de design ou implementação em um único módulo para que a decisão fique oculta de outros módulos

encapsulamento

  1. técnica de desenvolvimento de software que consiste em isolar uma função do sistema ou um conjunto de dados e operações sobre esses dados em um módulo e fornecer especificações precisas para o módulo
  2. conceito de que o acesso aos nomes, significados e valores das responsabilidades de uma classe é totalmente separado do acesso à sua realização
  3. idéia de que um módulo tem uma parte externa distinta da parte interna, que possui uma interface externa e uma implementação interna
jaco0646
fonte