O que define um encapsulamento corretamente?

5

Acho o conceito de encapsulamento um pouco confuso. Até agora eu li que os membros da classe devem ser privados e qualquer acesso a membros privados deve ser através de métodos getter e setter, que são públicos. Essas são as únicas propriedades que definem uma classe adequadamente encapsulada?

Se sim, e os membros da classe protegidos? Podemos acessar membros protegidos no mesmo pacote por meio de uma referência de objeto - as classes que contêm membros protegidos são encapsuladas de maneira imprópria?

Por favor, dê um esclarecimento.

    
por trapaank 19.10.2011 / 19:20
fonte

2 respostas

6

O encapsulamento está definindo corretamente o acesso aos membros de um objeto e protegendo o estado interno do objeto.

A primeira parte, definindo o acesso, é feita através dos especificadores de acesso ( public , private , protected e assim por diante). Normalmente, uma classe bem encapsulada limita o acesso tanto quanto possível. Se apenas a classe atual (ou uma instância dessa classe) precisar de acesso a ela, torne-a privada. Se as subclasses também precisarem de acesso, então é um membro protegido. Note que isso se aplica igualmente a variáveis e métodos.

A segunda parte é para proteger o estado interno do objeto de nunca ser inválido. Esse é um dos fatores que impulsionam os métodos de acesso e de mutação. Você pode usar esses métodos para sempre garantir a validade do estado do objeto. Por exemplo, se você tiver uma variável de membro que só pode conter valores específicos, poderá validar antes de alterar o estado do objeto, se precisar do uso de métodos de mutação, mas não puder com uma variável pública.

    
por 19.10.2011 / 19:31
fonte
2

Dependendo de quem está ensinando esse conceito, o encapsulamento pode ter tantas definições que é essencialmente uma palavra de ordem a ser definida com dezenas de outros chavões, às vezes até indo para a declaração ridícula como o seu "" até agora. ter lido que os membros da classe devem ser privados e qualquer acesso a esses membros privados deve ser através de métodos getters e setters que são públicos ".

A necessidade de encapsulamento normalmente surge quando você representa um objeto agregando um número de componentes cujos valores são um do outro relacionados e, portanto, não podem ser alterados de forma independente, sem fazer o objeto inválido ou sem pistas ou sem sentido ou sem calças ou como você quiser chamá-lo. Nesse caso, você - e somente você - assume a responsabilidade de gerenciar esses subvalores, tornando esse componente oculto (ou inacessível ... é uma questão muito importante sobre como a linguagem funciona) e fornecendo o agregado com métodos públicos que modificam os valores internos. corretamente.

-Editar Todo o resto é apenas "purismo sobre-construção" que realmente não implementa nada, à parte ... satisfazendo professores zelotes OOP.

-Editar PS: Eu tenho que me arrepender de todos os professores da OOP, mas 30 anos de experiência na indústria me faz realmente pensar sobre os danos de certas maneiras "não-críticas" de ensinar " regras " em vez de conceitos e relações entre eles! Você pode downvote, se você quiser, mas eu gostaria de ver uma demonstração prática que eu estou errado! O mundo está cheio de livros (muito ruins) ensinando coisas ruins como

class A
{
private:
   int x;
public:
   void set_x(int x_) { x=x_; }
   int get_x() const { return x; }
};

Isso não encapsulou nada, pois permite que você faça o que quiser com x .

    
por 19.10.2011 / 19:45
fonte