Salut à tous, développeurs noctambules ! (oui, 22h30 c'est tard pour programmer)
Admettons que j'ai une classe Directory, qui est une collection d'objets de type File.
Je fais le choix de stocker mes Files dans une liste chainée (ça pourrait être plus judicieux, mais là n'est pas la question).
Une classe client va donc parcourir la collection avec un code qui ressemble à ceci (je vous apprends rien) :
Ça marche très bien, là n'est pas le problème. Mais de toute évidence, ce code montre que l'implémentation de Directory est insuffisamment encapsulée (on voit quel type de collection est utilisé). Et comme chacun sait, ne pas encapsuler correctement, c'est mal.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Directory dir; list<File*> files = dir.GetFiles(); for(list<File*>::iterator it = files.begin(); it != files.end(); it++) { //bla bla bla }
Je m'attèle donc à utiliser un type d'itérateur générique. Je m'aperçois qu'il existe un header <iterator> dans la STL et décide donc d'explorer tout cela pour voir quel type serait le plus adapté.
Attention, à partir de ce point, ça devient hautement expérimental.
Je tente de modifier la méthode GetFiles().
De cette façon, l'implémentation est bien encapsulée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 iterator<bidirectional_iterator_tag, File*> Directory::GetFiles() { //je sais pas encore quoi }
Sauf que je ne sais pas comment aller au bout de cette idée.
Comment faire pour encapsuler le type de la collection ?
Partager