¿Es IOStream de C ++ un mal diseño?

Creo que es un excelente diseño para la década de 1990. Hay tres jerarquías de OOP significativas (las secuencias, las memorias intermedias y las facetas), que usan constantemente el idioma de interfaz no virtual (las funciones de miembros virtuales nunca deberían ser públicas), e incluso usan estructuras de datos inmutables (a los programadores funcionales les encantan) con punteros compartidos reembolsados ​​(los punteros compartidos de propósito general no aprobaron el comité completo en 1994, pero los iostreams los metieron debajo del capó de todos modos).

Los autores de iostreams lograron tomar el desorden gigante de printf / scanf y hacerlo completamente personalizable, exponiendo todo lo que las transmisiones de C hacen detrás de escena. Esto permitió E / S en tipos definidos por el usuario (no puede imprimir un std :: complex) con buffers definidos por el usuario (no puede escanear desde una secuencia TCP), con facetas definidas por el usuario (no puede escanear “a, b, c “para obtener a, byc), con codificaciones por flujo (no se puede imprimir f utf8 en un archivo y gb18030 en otro).

Esto solucionó simultáneamente los problemas de seguridad de tipo de las secuencias C (imprime un doble usando% d y obtienes un comportamiento indefinido) y el problema de rendimiento de tener que analizar la cadena de formato en tiempo de ejecución.

Sin embargo, a principios de la década de 1990, comúnmente se creía que la herencia y las funciones virtuales son la única forma verdadera de introducir un comportamiento personalizable, razón por la cual hay llamadas de funciones virtuales involucradas, en cada desbordamiento y desbordamiento del búfer. Además, la lógica de formateo fuera del tiempo de ejecución y en tiempo de compilación se realizó utilizando manipuladores de estado notoriamente detallados (¡pero infinitamente personalizables!), Que a menudo son criticados por hacer que el formateo no predeterminado sea difícil de mantener (y no llega tan lejos como hoy podría, las transiciones de estado todavía se realizan en tiempo de ejecución y de forma secuencial)

Dado lo que hemos aprendido sobre programación en los últimos 15 años … sigue siendo muy difícil hacer una mejor biblioteca de E / S de propósito general. Es fácil mejorar uno en cualquiera (o varios) aspectos, pero no en todos.

PD: aquí hay algunas notas de la reunión del comité de estándares que arrojan ideas para la mejora de iostreams N4412: Deficiencias de iostreams

Creo que el “texto como interfaz universal” de Ken Thompson es un mal diseño. Y esta es la base de las corrientes. Las transmisiones son una abstracción de las interfaces seriales que se encuentran en equipos de telecomunicaciones ubicuos en la década de 1960. Dado unix, C, C ++ son todos AT&T, es comprensible.
PARC, Unicode, etc., abandonaron por completo este paradigma, y ​​ahora todos usamos interfaces gráficas de usuario, dispositivos señaladores, etc.
Y confía en mí, nadie está conectando una pila TCP a un iostream.
Dicho esto, en sí mismo, los iostreams y las facetas son dignos de estudio. Hay mucha buena ingeniería en marcha. xalloc está desactualizado, pero sentrys, descubrimiento de tipo, polimorfismo dinámico, todas estas son buenas técnicas para conocer.
Nunca he encontrado un uso práctico para facetas o iostreams en un contexto I18n, l10n, hay mejores formas, pero como C ++ sólido y bueno, vale la pena su tiempo para leer el libro de Langer

La interfaz actual de IOStreams no admite la extracción de tipos inmutables de flujos de entrada. Esto se convertirá en un problema más común en el futuro, con un enfoque aún más en la programación paralela, y el tipo fuerte garantiza que ayuda a hacer que sea más fácil tratarlo (como la inmutabilidad).

No sé qué otros problemas hay, pero este parece ser bastante obvio. No estoy seguro de si esto es posible de resolver con el diseño actual `stream >> newvalue;`. Si la sintaxis se cambiara para hacerlo posible, ¿dónde especificaría el tipo y cuál sería su alcance?