Primeiro, pode parecer que estou pedindo opiniões subjetivas, mas não é isso que estou procurando. Eu adoraria ouvir alguns argumentos bem fundamentados sobre esse tópico.
Na esperança de ter uma ideia de como deve ser projetada uma estrutura moderna de fluxos / serialização, recentemente consegui uma cópia do livro Standard C ++ IOStreams and Locales de Angelika Langer e Klaus Kreft . Imaginei que, se o IOStreams não fosse bem projetado, ele não teria entrado na biblioteca padrão C ++ em primeiro lugar.
Depois de ler várias partes deste livro, estou começando a ter dúvidas se o IOStreams pode ser comparado com, por exemplo, o STL de um ponto de vista geral da arquitetura. Leia, por exemplo, esta entrevista com Alexander Stepanov (o "inventor" do STL) para aprender sobre algumas decisões de design que entraram no STL.
O que me surpreende em particular :
Parece ser desconhecido quem foi responsável pelo design geral do IOStreams (eu adoraria ler algumas informações básicas sobre isso - alguém conhece bons recursos?);
Uma vez que você mergulhar abaixo da superfície imediata de iostreams, por exemplo, se você deseja estender iostreams com suas próprias classes, você começa a uma interface com nomes de função de membro bastante enigmáticos e confuso, por exemplo,
getloc
/imbue
,uflow
/underflow
,snextc
/sbumpc
/sgetc
/sgetn
,pbase
/pptr
/epptr
(e não há exemplos provavelmente ainda piores). Isso torna muito mais difícil entender o design geral e como as peças únicas cooperam. Mesmo o livro que eu mencionei acima não ajuda que muito (IMHO).
Assim, minha pergunta:
Se você tivesse que julgar pelos padrões de engenharia de software de hoje (se há realmente é qualquer acordo geral sobre estes), seria 's C ++ iostreams ainda ser considerada bem concebido? (Eu não gostaria de melhorar minhas habilidades de design de software de algo que geralmente é considerado desatualizado.)
std::streambuf
é a classe base para leitura e gravação de bytes e istream
/ ostream
é para entrada e saída formatada, tendo um ponteiro std::streambuf
como destino / fonte.
ostream foo(&somebuffer); foo << "huh"; foo.rdbuf(cout.rdbuf()); foo << "see me!";