Bonjour,
une petite question existentielle concernant la loi de Demeter.
Imaginons que, dans notre programme, nous utilisons un objet défini et implémenté dans une bibliothèque tierce. Disons que cet objet sert à envoyer du texte à un client, nous l’appellerons Sender. Concrètement, nous ne nous préoccupons pas de savoir comme s'y prend Sender; la seule chose qui nous importe c'est que lorsqu'on appelle Sender::send( my_string ) my_string soit bien envoyée au client. Mais tout de même, Sender propose tout un tas de fonctionnalités de "tuning", comme le réglage des time_out, des fonctionnalité concernant le cryptage, etc, et au final, le protocole (ensemble de fonctions membre publiques) de Sender est assez fourni.
Afin de faciliter l'utilisation de Sender au sein de notre programme, nous décidons de l'encapsuler dans une classe à nous:
Mais, en plus de ces fonctionnalités, nous voudrions pouvoir utiliser directement toutes les fonctionalités de Sender. La première solution serait de faire en sorte que MySender wrappe le protocole de Sender: pour toutes les fonctions membres publiques de Sender, on implémente la même dans MySender et on appelle the_sender.the_fonction( the_parameters );
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 class MySender { public: // une fonction qui permet d'envoyer un tableau de string (ce que ne permet pas Sender) Send( const std::vector< std::string > & my_strings ); // ainsi que d'autres fonctionnalités qui ajoutent des traitements avant d'envoyer les chaines de caratères private: Sender the_sender; };
Seulement le protocole de Sender est long, et on a la flemme de tout réécrire. De plus, cela parait un travail inutile puisqu'il suffirait que MySender puisse renvoyer une référence constante sur the_sender et on utiliserait directement le protocole de Sender. Sauf que, cela va à l'encontre de la loi de Demeter.
Existe-t-il un autre solution que de redéfinir tout le protocole de Sender?
Partager