Во-первых, может показаться, что я прошу субъективного мнения, но это не то, что мне нужно. Очень хотелось бы услышать аргументированные аргументы на эту тему.
В надежде получить некоторое представление о том, как должна быть разработана современная структура потоков / сериализации, я недавно купил себе копию книги « Стандартные C ++ IOStreams and Locales » Анджелики Лангер и Клауса Крефта . Я полагал, что если бы IOStreams не был хорошо спроектирован, он бы вообще не попал в стандартную библиотеку C ++.
Прочитав различные части этой книги, я начинаю сомневаться, можно ли IOStreams сравнивать, например, с STL с общей архитектурной точки зрения. Прочтите, например, это интервью с Александром Степановым («изобретателем» STL), чтобы узнать о некоторых проектных решениях, которые вошли в STL.
Что меня особенно удивляет :
Кажется, неизвестно, кто отвечал за общий дизайн IOStreams (я хотел бы прочитать некоторую справочную информацию об этом - кто-нибудь знает хорошие ресурсы?);
Как только вы погрузитесь в непосредственную поверхность IOStreams, например, если вы хотите расширить IOStreams своими собственными классами, вы попадете в интерфейс с довольно загадочными и запутанными именами функций-членов, например
getloc
/imbue
,uflow
/underflow
,snextc
/sbumpc
/sgetc
/sgetn
,pbase
/pptr
/epptr
(и есть наверное даже худшие примеры). Это значительно усложняет понимание общей конструкции и взаимодействия отдельных частей. Даже книга , которую я упоминал выше , не помогает , что много (ИМХО).
Таким образом, мой вопрос:
Если бы вам пришлось судить по сегодняшним стандартам разработки программного обеспечения (если на самом деле существует какое-либо общее соглашение по ним), можно ли считать IOStreams C ++ хорошо разработанными? (Я бы не хотел улучшать свои навыки разработки программного обеспечения с помощью того, что обычно считается устаревшим.)
std::streambuf
является базовым классом для чтения и записи байтов, а istream
/ ostream
предназначен для форматирования ввода и вывода, принимая указатель на std::streambuf
его место назначения / источник.
ostream foo(&somebuffer); foo << "huh"; foo.rdbuf(cout.rdbuf()); foo << "see me!";