je le pense, le mot-cle friend est essenciel a une architecture de qualite. et je dis ca en ayant de bonne connaissance des design-patterns.
Il y a une idee recu, de je ne sais d'ou, que l'usage du mot-clef friend reflete un defaut de conception. et c'est de cela que je voudrais debattre.
certains arguent que "friend" viole le concept d'encapsulation, mais je dirais que ca le renforce. Pour illustrer mon propos, prenons un example simple:
(sans friend)
Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 class Book { public: Book(double reference, string title, string author, float price); float getPrice() const; string getTitle() const; string getAuthor() const; double getReference() const; void setPrice(float price); private: double _reference; string _title; string _author; float _price; }; class BookManager { public: BookManager& getInstance(); void CreateBook(double reference, string title, string author, float price); // new Book(...); void ChangePrice(double reference, float newprice); //Book::setPrice(...); private: BookManager(); std::map<double,book*> BookList; static BookManager* _instance; };
(avec friend)
Code c++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 class Book { public: float getPrice() const; string getTitle() const; string getAuthor() const; double getReference() const; private: Book(double reference, string title, string author, float price); //acessible a BookManager seulement void setPrice(float price); //acessible a BookManager seulement double _reference; string _title; string _author; float _price; friend class BookManager; }; class BookManager { public: void CreateBook(double reference, string title, string author, float price); // new Book(...); void ChangePrice(double reference, float newprice); //Book::setPrice(...); private: BookManager& getInstance(); BookManager(); std::map<double,book*> BookList; static BookManager* _instance; };
on considere que le titre, l'auteur et la reference ne change jamais.
l'implementation sans friend expose le constructeur de book a tout objet, ainsi que la modification du prix.
l'implementation avec friend restreint l'instantation, et la modification de book a l'instance unique BookManager. certe BookManager peut mettre la pagaille a tout les membres prive, mais il est plus sur de tout exposer a un ami, que d'exposer quelques membres qu'on aimerai pas publiquement.
qu'en dites vous?
Partager