Ainsi, si tu as une fonction membre d'une classe D qui nécessite un paramètre dont le type est une classe C, on peut considérer que cette fonction membre fait réellement partie de l'interface publique de C (en plus de faire partie de l'interface de D, bien évidemment

).
Une fois que tu as cette notion "d'interface étendue" en tête, tu te rend compte que l'interface publique d'une fonction finit par être très (mais alors, vraiment très) importante, tend à en compliquer singulièrement l'usage, surtout si toutes les fonctionnalités qui font partie de cette interface publique sont effectivement accessibles depuis un seul et même fichier d'en-tête (comme ce serait le cas si toutes ces fonctions étaient définies sous la forme de fonctions membres).
Et, bien sur, si l'on déclare toutes ces fonctions dans un seul fichier d'en-tête, les temps de compilation vont littéralement exploser : à chaque fois que les gardes anti inclusion n'auront pas supprimé le contenu du fichier d'en-tête, le compilateur devra forcément lire (et manipuler) le contenu du fichier en entier, ce qui est dommage car, ce faisant, il va peut être "perdre son temps" à définir les symboles correspondant à un grand nombre de fonctions dont nous n'avons absolument pas l'usage dans une situation donnée.
Du coup, l'idée (qui sert d'ailleurs de base à l'ISP) est de partir du point de vue que, si l'on n'a pas une excellente raison de créer une fonction membre, nous avons sans doute intérêt à créer une fonction libre et, tant qu'à faire, à la déclarer dans un fichier d'en-tête séparé. Cette manière de travailler va permettre plusieurs choses :
D'abord, tes fichiers d'en-tête deviennent beaucoup plus "courts". Cela facilite le travail qui consiste à se créer une "carte mentale" des fonctionnalités auxquelles ce fichier donne accès (il n'y a rien à faire, on lira beaucoup plus facilement un fichier composé d'une petite centaines de lignes qu'un fichier composés de plusieurs milliers de lignes

).
De plus, cela permettra au compilateur de n'avoir à créer les symboles que des fonctionnalités dont on a réellement besoin : si tu as besoin d'une fonctionnalité, il est possible que tu aies aussi besoin des fonctionnalités "qui vont bien" avec, mais si tu n'en as pas besoin, pourquoi devrait-il perdre son temps à créer les symboles en question

.
Enfin,les gardes anti inclusion multiples et les déclarations anticipées permettront de faire en sorte de limiter très fortement la taille totale des informations à traiter
Et puis, cerise sur le gâteau, il reste toujours la possibilité de déclarer une fonction libre comme étant amie d'une classe pour éviter d'avoir à exposer des détails qui seraient de nature à briser l'encapsulation.
Bref, sous réserve de travailler correctement (comprends: d'utiliser autant que possible les déclarations anticipées et / ou l'amitié quand c'est réellement nécessaire), tu as sans doute "tout à gagner" à ne pas avoir une approche strictement basée sur le paradigme orienté objets. C'est d'autant plus vrai que le langage te permet de le faire, dés lors, pourquoi voudrais tu t'en priver
Partager