En primer lugar, puede parecer que estoy pidiendo opiniones subjetivas, pero eso no es lo que busco. Me encantaría escuchar algunos argumentos bien fundados sobre este tema.
Con la esperanza de obtener una idea de cómo debe diseñarse un marco de transmisión / serialización moderno, recientemente obtuve una copia del libro Standard C ++ IOStreams and Locales de Angelika Langer y Klaus Kreft . Pensé que si IOStreams no estuviera bien diseñado, no habría llegado a la biblioteca estándar de C ++ en primer lugar.
Después de haber leído varias partes de este libro, estoy empezando a tener dudas sobre si IOStreams puede compararse, por ejemplo, con el STL desde un punto de vista arquitectónico general. Lea, por ejemplo, esta entrevista con Alexander Stepanov (el "inventor" de la STL) para conocer algunas decisiones de diseño que entraron en la STL.
Lo que me sorprende en particular :
Parece que se desconoce quién fue el responsable del diseño general de IOStreams (me encantaría leer algunos antecedentes sobre esto: ¿alguien conoce buenos recursos?);
Una vez que profundiza debajo de la superficie inmediata de IOStreams, por ejemplo, si desea extender IOStreams con sus propias clases, llega a una interfaz con nombres de funciones de miembro bastante crípticos y confusos, por ejemplo
getloc
/imbue
,uflow
/underflow
,snextc
/sbumpc
/sgetc
/sgetn
,pbase
/pptr
/epptr
(y hay probablemente incluso peores ejemplos). Esto hace que sea mucho más difícil comprender el diseño general y cómo cooperan las piezas individuales. Incluso el libro que he mencionado anteriormente no ayuda a que mucho (en mi humilde opinión).
Por lo tanto mi pregunta:
Si tuviera que juzgar según los estándares de ingeniería de software de hoy (si realmente hay algún acuerdo general sobre estos), ¿los IOStreams de C ++ aún se considerarían bien diseñados? (No me gustaría mejorar mis habilidades de diseño de software de algo que generalmente se considera obsoleto).
std::streambuf
es la clase base para leer y escribir bytes, y istream
/ ostream
es para formato de entrada y salida, tomando un puntero std::streambuf
como destino / fuente.
ostream foo(&somebuffer); foo << "huh"; foo.rdbuf(cout.rdbuf()); foo << "see me!";