Qual é a diferença entre "ocultação de dados" e "encapsulamento"?

29

Estou lendo "concorrência Java na prática" e é dito: "Felizmente, as mesmas técnicas orientadas a objetos que ajudam a escrever classes bem organizadas e sustentáveis ​​- como encapsulamento e ocultação de dados - também podem ajudá-lo a criar um thread-safe classes ".

O problema # 1 - nunca ouvi falar sobre ocultação de dados e não sei o que é.

O problema # 2 - sempre pensei que o encapsulamento está usando privado versus público e, na verdade, é o esconderijo de dados.

Você pode explicar o que é ocultação de dados e como ela difere do encapsulamento?

dhblah
fonte
2
Leia Code Complete 2nd edition . Ele responderá a muitas das suas perguntas.
Shiplu Mokaddim
Em relação à ocultação de informações, consulte: javaworld.com/jw-05-2001/jw-0518-encapsulation.html
Dave Jarvis
Este link fornece informações úteis sobre essas informações Ocultando um princípio de design, especifica que uma decisão de design deve ser ocultada do restante do sistema para evitar acoplamentos não intencionais. Deve informar a maneira como você encapsula as coisas, mas é claro que não precisa. Encapsulamento é um recurso da linguagem de programação.
Abhijeet

Respostas:

19

Esconder dados e informações são noções mais amplas, encontradas em ciência da computação e engenharia de software. Refere-se ao fato de que as partes de um programa de computador que podem mudar não devem ser acessíveis a partir de outros módulos / de clientes.

Encapsulamento é um termo encontrado no paradigma Orientado a Objetos e refere-se a manter os dados em campos privados e modificá-los apenas através de métodos.

Assim, o encapsulamento pode ser visto como uma maneira de obter dados ocultos em sistemas orientados a objetos .

m3th0dman
fonte
1
Obrigado pela resposta. Ainda não entendo por que, se a ocultação de dados é a mesma, mas um pouco mais ampla que o encapsulamento, isso é referido no livro como se tivessem uma largura semelhante e não uma, incluindo a outra.
dhblah
Os autores provavelmente fazem a diferença entre ocultar dados e ocultar informações, no sentido de que oculta apenas oculta as estruturas de dados - os campos particulares - enquanto oculta informações pode se referir a encapsular detalhes de implementação (algoritmos usados ​​por exemplo), a comunicação sendo feita apenas por meio de interfaces.
M3th0dman
2
Você pode ter um sem ter o outro - observe o Python, onde não há dados ocultos (nenhum atributo privado ou protegido).
Latty
@ O argumento da Lattyware é muito verdadeiro e importante. Pode-se também ter um encapsulamento (por sua definição, ao qual me oponho por causa do que estou descrevendo aqui) sem ocultar nada, ou seja, expondo cegamente um getter e setter trivial para cada membro. Isso não esconde nada e não impede nada, mas cumpre a definição comum de encapsulamento à letra.
1
Encapsulamento não mantém dados em campo privado, é mais ocultação de informações. Encapsulamento, de uma maneira geral, é o conceito de reunir (encapsular) informações / dados e métodos em uma classe.
N11 11/04
6

Encapsulamento e ocultação de dados são termos relacionados. É importante entender que eles surgem em relação à Abstração . Booch et. al. em Análise e design orientados a objetos com aplicativos explica,

Abstração e encapsulamento são conceitos complementares: a abstração se concentra no comportamento observável de um objeto, enquanto 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 (e não apenas da ocultação de dados), que é o processo de ocultar todos os segredos de um objeto que não contribuem para suas características essenciais; normalmente, a estrutura de um objeto está oculta, bem como a implementação de seus métodos.

theD
fonte
5

Criar uma classe inclui o conceito de encapsulamento. Quando você cria uma classe, coloca dados e comportamentos dentro da classe e ela se torna uma unidade que chamamos de objeto. Portanto, a ocultação de dados faz parte do encapsulamento.

Aleko Gharibashvili
fonte
4

Da Wikipedia :

Em uma linguagem de programação, o encapsulamento é usado para se referir a uma das duas noções relacionadas, mas distintas, e às vezes à combinação das mesmas:

  • Um mecanismo de linguagem para restringir o acesso a alguns dos componentes do objeto.
  • Uma construção de linguagem que facilita o agrupamento de dados com os métodos (ou outras funções) que operam nesses dados.

Alguns pesquisadores e acadêmicos da linguagem de programação usam o primeiro significado sozinho ou em combinação com o segundo como um recurso distintivo da programação orientada a objetos, enquanto outras linguagens de programação que fornecem fechamentos lexicais veem o encapsulamento como um recurso da linguagem ortogonal à orientação a objetos.

A segunda definição é motivada pelo fato de que, em muitas linguagens OOP, a ocultação de componentes não é automática ou pode ser substituída; assim, a ocultação de informações é definida como uma noção separada por aqueles que preferem a segunda definição.

Michael Borgwardt
fonte
Obrigado pela sua resposta. Perguntas de acompanhamento: 1) a linguagem de programação java possui recursos aos quais a segunda noção relacionada ao encapsulamento se refere? 2) Não entendo por que a substituição de dados ocultos é importante. Por exemplo, em java, você pode acessar qualquer campo (público ou privado) através da reflexão.
dhblah
@ Aluno de Engenharia de Software: as classes como construções de código-fonte representam a segunda noção. Quanto à ocultação de informações, o ponto é que a limitação do escopo dos dados geralmente se baseia em mecanismos de linguagem específicos e separados.
Michael Borgwardt
2

Eles geralmente são usados ​​de forma intercambiável na discussão e, geralmente, acho que eles trabalham juntos para alcançar o mesmo objetivo, e embora o seguinte possa não ser completamente preciso, ele pode fornecer alguma distinção significativa, se for necessário fazer uma distinção:

Quando se fala em encapsulamento, geralmente é implementado como um mecanismo processual / funcional. Existe algum tipo de proteção para o estado subjacente, e o acesso através da proteção exige que certos protocolos sejam seguidos para ter acesso (leia ou altere o estado desejado). O encapsulamento também oferece a oportunidade de ocorrência de efeitos colaterais devido ao acesso (como alteração de estado em cascata ou notificação / aumento de um evento / emissão de um sinal quando a coisa de interesse é lida ou alterada) para que ações de acompanhamento possam ser iniciadas. Novamente, costumo pensar em encapsulamento como um conceito que é implementado como um procedimento.

Vejo que o conceito de ocultação de dados é semelhante ao propósito de encapsulamento; no entanto, o mecanismo é estrutural e opera em um nível diferente. Na prática, em vez de fornecer um mecanismo de guarda e efeito colateral por meio de procedimento, o estado é protegido e afetado por mecanismos estruturais da linguagem e do tempo de execução. Esses tipos de guardas seriam cláusulas de visibilidade, definições de tipos, herança e similares. Os efeitos colaterais que você pode aproveitar dos objetos protegidos estruturalmente são novamente algo que depende da linguagem e do tempo de execução: talvez a ativação de objetos, a contagem de referências ou algo nesse sentido.

JustinC
fonte
0

Eles são frequentemente, talvez geralmente, usados ​​de forma intercambiável. Mas observe que a citação de Booch acima diz: "O encapsulamento é mais frequentemente alcançado através da ocultação de informações ..." ou seja, na maioria das vezes, mas nem sempre em todos os casos.

Observe que o Python permite a rolagem de dados nas classes, mas não permite variáveis ​​privadas. Portanto, pode-se dizer que o Python fornece encapsulamento sem ocultar os dados.

Você poderia fazer a mesma coisa em Java tornando todas as suas variáveis ​​de membro public , mas além de um ataque cardíaco a todos, perderia o benefício de ocultar dados ... ou seja, preservar a semântica de um objeto, restringindo o acesso ao seu estado.

Roubar
fonte
0

No OO, Encapsulamento é onde as informações são mantidas dentro de um Objeto. Por exemplo, a Personpossui a namee clientes Person (ou seja, você) sabem que Person possui um nome, por meio de campos públicos ou métodos de acessador. E, esperançosamente, você também não precisa conter os nomes em uma matriz global de nomes, etc. Portanto, este é um grande passo para evitar códigos espaguetes não gerenciáveis. Mas o cliente ainda precisa saber algo sobre como a Pessoa lida com nomes: por exemplo, espaço ou vírgula delimitada?

Ocultar dados é onde Persontem um campo de nome, mas, pelo menos em teoria, ninguém sabe . O campo é privado, sem métodos de acesso público. Os clientes podem passar um nome de um registro de banco de dados, XML, HTTP POST, qualquer que seja, mas o trabalho interno de como o Person lida com o nome é uma "caixa preta". As implementações futuras do Person podem mudar, por exemplo, para ter umfirstName e a lastName.

Em um mundo ideal, o Data Hiding é superior ao Encapsulation, mas nem todos os mundos são ideais. :-)

user949300
fonte