Utilisation du "friend"

Utilisation du "friend"

by Paul Charles Jacques Boulenger -
Number of replies: 2

Bonjour, 

Je me demandais à quel point il est déconseillé d'utiliser le "friend".

Par exemple, s'il on crée une classe2 qui a des attributs de type classe1 (par exemple Matrice33 qui a des attributs de type Vecteurs si l'on a choisit cela), il me semble utile d'utiliser le "friend" pour les méthodes de classe2,  afin d'avoir un accès plus facile aux attributs (privés) de classe1 et ainsi obtenir un code moins "lourd" (moins d'utilisation des accesseurs). D'autant plus que cela ne brise pas totalement l'encapsulation puisque que le friend n'est utilisé que d'une classe à l'autre et, sauf erreur, les attributs privés de classe1 restent inaccessibles a l'extérieur des deux classes.

Qu'en pensez-vous ?

In reply to Paul Charles Jacques Boulenger

Re: Utilisation du "friend"

by Jean-Cédric Chappelier -

friend est absolument à proscrire (comme toujours : sauf (rares) exception) car en effet il casse l'encapsulation.
Dans votre cas : l'encapsulation des Vecteur est cassée pour les Matrice33 : le jour où l'ond décide de changer la représentation interne des Vecteur, on sera obligé de changer le code des Matrice33 ; ce qui est justement ce que les principes d'encapsulation et d'abstration cherchent à éviter !
Avec friend, vous augmenter le couplage entre parties du code ; ce qui est précisément l'inverse des principes de base recherchés par l'OO.

Qu'y a-t-il de plus lourd à écrire z.x() plutôt que z.x (pour l'exemple des Complexe).

Si le code est lourd à écrire, c'est peut être qu'il vous manque de bonne méthodes (publique) ou alors des maths (= des expressions algébriques compactes ; et du coup, peut être aussi les méthodes correspondantes ; par exemple pour faire un produit de matrice on peut utiliser des produits scalaires entre vecteurs lignes et vecteurs colonnes ; si l'on creuse dans ce sens, alors il faudrait certainement offrir une « vue » « vecteur colonne j » sur les Matrice : c.-à-d. une méthode qui retourne, sans copie (c'est ça que j'appelle « vue ») une colonne de la Matrice pour la voir comme un Vecteur ; mais ceci est certainement avancé et nécessiterait trop de code pour que ça vaille la peine ; c'est juste pour illustrer le propos ; dans votre cas concret (Matrice 3 par 3) le plus simple est certainement d'écrire directement les formules (et quel lien avec des vecteurs de dimension quelconque ??) [je ne vous demande pas de répondre à cela ; simplement d'y réfléchir de votre coté ; et j'y vois 2 réponses (correctes) possibles]