Généralement, dans la vitesse de développement de jeux en C ++, la valeur est préférée à l'encapsulation, vous voyez donc une tonne de membres de classe accessibles au public qui ne devraient vraiment pas être publics.
Il semble que dans la plupart des cas, seuls quelques clases très sélectes ont vraiment besoin de connaître le fonctionnement interne d'une autre classe au point de modifier ou de lire leurs données privées.
La création de getters / setters publics pour ces données privées expose des choses qui ne devraient vraiment pas être modifiées à volonté.
Un compromis serait-il ici d'utiliser des classes d'amis? ou y a-t-il un inconvénient aux classes d'amis que je ne vois pas.
la source
Une autre option consiste à utiliser l' idiome PIMPL , où une partie de l'implémentation de la structure est un pointeur vers un autre type. La plupart des utilisateurs de la classe incluront simplement le fichier d'en-tête normal, où l'implémentation est un pointeur opaque. Les classes qui ont besoin d'accéder aux données privées peuvent inclure l'en-tête définissant l'autre type et utiliser l'interface qu'il fournit.
C'est un modèle courant pour les programmeurs C qui souhaitent une fonctionnalité de type ami. À mon avis, cela permet également de réfléchir plus étroitement à la séparation des préoccupations (un principe de conception généralement bon qui conduit à un code orthogonal réutilisable) plutôt qu'à l'encapsulation (une technique spécifique à l'OO qui est utile pour mettre en œuvre la séparation des préoccupations, mais aussi souvent utilisée à mauvais escient). pour compliquer les choses).
Il a un avantage sur l'ami qu'il ne couple pas du tout l'ami à l'ami-ee. Certaines personnes pourraient prétendre que c'est un inconvénient, car maintenant, n'importe qui peut "amier" votre classe. Je pense que c'est une crainte injustifiée, car vous expliquez toujours la relation (en incluant l'en-tête). Si vous en avez peur, vous avez peur de votre capacité (ou celle de votre collègue) de prendre des décisions architecturales intelligentes. Mais si vous ne pouvez pas prendre ces décisions correctement plus tard, pourquoi vous faites-vous confiance
friend
maintenant?Il présente un inconvénient du coût d'exécution. En stockant les données dans un pointeur, vous obtenez une cohérence de cache plus faible et plus de comptes d'allocation, et vous avez également besoin d'un destructeur pour les nettoyer.
la source