По-перше, може здатися, що я прошу суб'єктивних думок, але це не те, що я після цього. Я хотів би почути кілька обґрунтованих аргументів на цю тему.
Сподіваючись отримати деяке розуміння того, як має бути спроектована сучасна структура потоків / серіалізації, я нещодавно отримав собі примірник книги Standard C ++ IOStreams and Locales від Angelika Langer та Klaus Kreft . Я подумав, що якби IOStreams не був належним чином розроблений, це не перетворило б його в стандартну бібліотеку C ++.
Прочитавши різні частини цієї книги, у мене виникають сумніви, чи можна IOStreams порівняти, наприклад, STL з загальної архітектурної точки зору. Прочитайте, наприклад, це інтерв'ю з Олександром Степановим ("винахідником" STL), щоб дізнатись про деякі дизайнерські рішення, які увійшли до STL.
Що мене особливо дивує :
Здається, невідомо, хто відповідав за загальний дизайн IOStreams (я хотів би прочитати довідкову інформацію про це - хтось знає хороші ресурси?);
Після того, як ви заглибитесь під безпосередню поверхню IOStreams, наприклад, якщо ви хочете розширити IOStreams своїми власними класами, ви потрапляєте на інтерфейс із досить криптовими і заплутаними іменами функцій членів, наприклад,
getloc
/imbue
,uflow
/underflow
,snextc
/sbumpc
/sgetc
/sgetn
,pbase
/pptr
/epptr
(і є мабуть, ще гірші приклади). Це ускладнює розуміння загальної конструкції та взаємодії окремих деталей. Навіть книга , яку я згадував вище , не допомагає , що багато (ІМХО).
Отже, моє запитання:
Якби вам довелося судити за сьогоднішніми стандартами програмної інженерії (якщо насправді існує якась загальна згода на це), чи все-таки IOStream C ++ все ще вважався б добре розробленим? (Я не хотів би вдосконалювати свої навички проектування програмного забезпечення на основі того, що зазвичай вважається застарілим.)
std::streambuf
є базовим класом для читання та запису байтів та istream
/ ostream
є для форматованого вводу та виводу, беручи вказівник на std::streambuf
місце призначення / джерело.
ostream foo(&somebuffer); foo << "huh"; foo.rdbuf(cout.rdbuf()); foo << "see me!";