【发布时间】:2011-02-14 17:36:54
【问题描述】:
首先,我似乎在征求主观意见,但这不是我所追求的。我很想听听关于这个话题的一些有根据的论点。
为了深入了解现代流/序列化框架应该如何设计,我最近得到了一本Standard C++ IOStreams and Locales by Angelika Langer and Klaus Kreft 的书。我想,如果 IOStreams 没有经过精心设计,它一开始就不会进入 C++ 标准库。
在阅读了本书的各个部分后,我开始怀疑 IOStreams 是否可以与 e.g.从整体架构的角度来看 STL。阅读例如this interview with Alexander Stepanov (the STL's "inventor") 了解进入 STL 的一些设计决策。
让我特别惊讶的地方:
似乎不知道谁负责 IOStreams 的整体设计(我很想阅读一些有关这方面的背景信息——有谁知道好的资源吗?);
一旦您深入到 IOStreams 的直接表面之下,例如如果你想用你自己的类扩展 IOStreams,你会得到一个具有相当神秘和令人困惑的成员函数名称的接口,例如
getloc/imbue,uflow/underflow,snextc/sbumpc/sgetc/sgetn,pbase/@9876543334@/@987654 )。这使得理解整体设计以及单个部件如何协作变得更加困难。即使是我上面提到的那本书也没有太大帮助(恕我直言)。
所以我的问题是:
如果您必须按照当今的软件工程标准来判断(如果实际上对这些标准有任何普遍的一致意见),C++ 的 IOStreams 是否仍然被认为是精心设计的? (我不想从通常被认为过时的东西中提高我的软件设计技能。)
【问题讨论】:
-
有趣的 Herb Sutter 的意见 stackoverflow.com/questions/2485963/… :) 太糟糕了,那家伙只参与了几天就离开了
-
还有其他人在 STL 流中看到混合的关注点吗?流通常旨在读取或写入字节,仅此而已。可以读取或写入特定数据类型的东西是格式化程序(可能但不需要使用流来读取/写入格式化字节)。将两者混合到一个类中会使实现自己的流变得更加复杂。
-
@rsteven,这些关注点是分开的。
std::streambuf是读取和写入字节的基类,istream/ostream用于格式化输入和输出,将指向std::streambuf的指针作为其目标/源。 -
@litb:但是可以切换流(格式化程序)使用的streambuf吗?所以也许我想使用 STL 格式但想通过特定的 streambuf 写入数据?
-
@rstevens,
ostream foo(&somebuffer); foo << "huh"; foo.rdbuf(cout.rdbuf()); foo << "see me!";