Classes aninhadas: uma ferramenta útil ou uma violação de encapsulamento?

11

Portanto, ainda estou em dúvida se devo ou não usá-las.

Eu sinto que é uma violação extrema do encapsulamento, no entanto, acho que sou capaz de atingir algum grau de encapsulamento enquanto ganho mais flexibilidade no meu código.

Projetos Java / Swing anteriores Eu havia usado classes aninhadas até certo ponto, mas agora mudei para outros projetos em C # e evito o uso deles.

Como você se sente sobre as classes aninhadas?

Bryan Harrington
fonte
Como exatamente as classes aninhadas são uma violação do encapsulamento? Se alguma coisa, eles são mais encapsulados, pois são 'encapsulados' dentro de outra classe e, opcionalmente, podem ser tornados privados.
Steven Jeuris

Respostas:

8

Bem, simplificando: as classes aninhadas não violam o encapsulamento e, em geral, os recursos de linguagem não violam os princípios de programação. Programadores violam princípios de programação.

Curiosamente, alega-se que as classes aninhadas aumentam o encapsulamento :

Encapsulamento aumentado - considere duas classes de nível superior, A e B, nas quais B precisa acessar membros de A que, de outra forma, seriam declarados privados. Ocultando a classe B na classe A, os membros de A podem ser declarados privados e B pode acessá-los. Além disso, o próprio B pode ser oculto do mundo exterior.

Há alguma verdade nisso.

Normalmente, B é o resultado da aplicação do SRP a A. O próprio B, no entanto, viola muitos princípios, especialmente se tudo o que faz é brincar com os membros privados de A: D

Eu acho que aulas ocultas podem ser úteis. Mas há muito potencial para uso indevido.

back2dos
fonte
5

Usamos classes aninhadas o tempo todo. Em muitas situações, os softwares / processos de negócios aninharam objetos de negócios. Todos nós vimos o exemplo de um objeto Order que possui uma coleção aninhada de OrderItems.

A linha inferior é que facilita a leitura / gravação do código e raramente há um caso em que você precisaria da sua classe Order e não precisaria saber sobre OrderItems.

Walter
fonte
1

Pessoalmente, acho que eles devem ser evitados, pois combinam seu design de várias maneiras (geralmente desfavoráveis).

No entanto, se seu projeto tiver um escopo definido e encapsular uma classe (como uma classe Node ou algum tipo de objeto usado para percorrer a estrutura de dados de uma classe específica), não vejo mal.

Na verdade, acho que, para certos tipos de projetos, torna o código (e o raciocínio) mais legível / fácil de entender. No entanto, para a maioria dos projetos com extensibilidade em mente, é uma péssima idéia, porque raramente os separar causará problemas, mas deixá-los juntos pode forçá-lo a dissociá-los no futuro (que é perda de tempo).

sova
fonte
0

(Em C #) Geralmente, eu os evitava, embora possa depender exatamente qual é o objetivo da classe.

Eu nunca os usaria para qualquer tipo de classe de modelo de domínio, que simplesmente não faz sentido para mim.

Eu costumava usá-los para estruturar dados privados na classe externa, mas descobri que eles quase sempre acabam sendo necessários externamente mais tarde no ciclo de vida do projeto, por isso geralmente não me incomodo mais com isso.

O único momento em que os uso agora é para o pequeno truque de codificação em que o uso de outra classe pequena facilita a implementação de uma classe específica ou a implementação de uma interface que é realmente apenas um padrão de notificação de eventos (em que a classe interna implementa uma interface e apenas passa controle de volta a classe externa).

Andy Lowry
fonte