Tout d'abord, il peut sembler que je demande des opinions subjectives, mais ce n'est pas ce que je recherche. J'aimerais entendre quelques arguments bien fondés sur ce sujet.
Dans l'espoir d'avoir un aperçu de la façon dont un framework de flux / sérialisation moderne devrait être conçu, je me suis récemment procuré une copie du livre Standard C ++ IOStreams and Locales par Angelika Langer et Klaus Kreft . J'ai pensé que si IOStreams n'était pas bien conçu, il ne l'aurait pas fait dans la bibliothèque standard C ++ en premier lieu.
Après avoir lu différentes parties de ce livre, je commence à avoir des doutes quant à savoir si IOStreams peut se comparer par exemple à la STL d'un point de vue architectural global. Lisez par exemple cet entretien avec Alexander Stepanov («l'inventeur» de la STL) pour en savoir plus sur certaines décisions de conception qui ont été prises dans la STL.
Ce qui me surprend en particulier :
Il semble que l'on ne sache pas qui était responsable de la conception générale d'IOStreams (j'aimerais lire quelques informations générales à ce sujet - est-ce que quelqu'un connaît de bonnes ressources?);
Une fois que vous avez fouillé sous la surface immédiate d'IOStreams, par exemple si vous souhaitez étendre IOStreams avec vos propres classes, vous accédez à une interface avec des noms de fonctions membres assez cryptiques et déroutants, par exemple
getloc
/imbue
,uflow
/underflow
,snextc
/sbumpc
/sgetc
/sgetn
,pbase
/pptr
/epptr
(et il y a probablement des exemples encore pires). Cela rend tellement plus difficile de comprendre la conception globale et la façon dont les pièces individuelles coopèrent. Même le livre je l' ai mentionné ci - dessus ne pas l' aide que beaucoup ( à mon humble avis).
Ainsi ma question:
Si vous aviez à en juger par les normes de génie logiciel d'aujourd'hui (s'il en fait est un accord général sur ces), serait C ++ 's iostreams encore être considéré comme bien conçu? (Je ne voudrais pas améliorer mes compétences en conception de logiciels à partir de quelque chose qui est généralement considéré comme obsolète.)
std::streambuf
est la classe de base pour la lecture et l'écriture d'octets, et istream
/ ostream
est pour l'entrée et la sortie formatées, prenant un pointeur vers std::streambuf
comme destination / source.
ostream foo(&somebuffer); foo << "huh"; foo.rdbuf(cout.rdbuf()); foo << "see me!";