Voici un exemple de code générique:Et voici le même code en POO:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 template<class F> class Traitement: public F { public: Traitement() {} void Faire() { //lire des données F::lire(); //calculer les données lues //... //sauver les résultats du calcul F::sauver(); } };
L'avantage du premier code est qu'il n'y a aucune contrainte sur le paramètre template F, seules les fonctions membres F::lire() et F::sauver() doivent exister.
Code : 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 //définition class Traitement { fichier_base & m_f; public: Traitement(fichier_base & f): m_f(f) {} void Faire(); }; //déclaration void Traitement::Faire() { //lire des données m_f.lire(); //calculer les données lues //... //sauver les résultats du calcul m_f.sauver(); }
L'inconvénient est que le code est exposé (puisque template); il peut aussi être assez lourd.
L'avantage du second code est qu'il n'est plus exposé.
Par contre fichier_base doit être une classe de base dont les fonctions membres lire() et sauver() doivent être virtuelles. Les multiples implémentations dont on pourrait avoir besoin pour faire() le Traitement devront obligatoirement dériver de fichier_base (lire et sauver dans une db, un fichier, un pipe, un socket, un container en mémoire, etc, soit rien en commun si ce n'est la définition des méthodes lire et sauver).
Ce que je trouve dommage est qu'il faille écrire une hiérarchie de classes avec fonctions membres virtuelles alors qu'en définitive l'usage qui sera fait de cette hiérarchie sera figée lors de la conception, et donc de la compilation. Les méthodes virtuelles ne seront pas utiles et, dans une certaine mesure, un ralentissement à l'exécution.
En fait, le polymorphisme en puissance de fichier_base ne sera pas utilisé en pratique à l'exécution. Malgré cela, je pense c'est le bon choix de conceptualiser dans ce cas-ci.
Je commençais à avoir une tendance ces derniers temps à "templatiser" à tout va mais je me trouve face à certaines limites.
A vous lire, en espérant que vous ayez compris la problématique
Merci.
Partager