| Se forem usadas adequadamente, elas, na realidade, melhoram o encapsulamento. Você
freqüentemente precisa repartir uma classe ao meio, quando as duas metades têm
diferentes números de instâncias, ou tem instâncias de diferentes durações (escopo).
Nesses casos, as duas metades usualmente precisam de acessar uma a outra (as duas metades
formam uma única classe, portanto você não aumentou o código que precisa de acesso
direto a estrutura de dados; você simplesmente distribuiu o código em duas classes, ao
invés de concentrá-lo em uma única classe). O modo seguro de implementar essa solução
é fazer as duas classes friends uma da outra.
Se você usa friends exatamente dessa
forma, você manterá os itens
private como private. As pessoas que não entendem isso
geralmente fazem um esforço, grande e ingênuo, de codificação para evitar usar friends em situações como a apresentada acima, e acabam, na
realidade, por destruir o encapsulamento. Essas pessoas ou usam dados public (grotesco!), ou
tornam os dados acessíveis a ambas as metades da classe via funções membro do tipo puclic get() e set(). Ter funções
membro public get() e set() para dados private faz sentido apenas quando são usadas fora da classe (de um ponto de vista
do usuário da classe). Em muitos casos, essas funções membro get() e set() são quase um mal
uso de dados public: elas ocultam apenas os nomes dos dados private, não ocultam
sua existência.
Do mesmo modo, se você usa funções friend como uma variante
sintática de funções de acesso aos itens public: da classe, elas não violam o
encapsulamento mais do que uma função membro qualquer. Em outras palavras, classes e
funções friends não violam a barreira do encapsulamento: assim com as funções membro
da classe, elas são a barreira do encapsulamento. |