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?
java
design
object-oriented
dhblah
fonte
fonte
Respostas:
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 .
fonte
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,
fonte
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.
fonte
Da Wikipedia :
fonte
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.
fonte
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.fonte
No OO, Encapsulamento é onde as informações são mantidas dentro de um Objeto. Por exemplo, a
Person
possui aname
e 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
Person
tem 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 alastName
.Em um mundo ideal, o Data Hiding é superior ao Encapsulation, mas nem todos os mundos são ideais. :-)
fonte