Trước hết, có vẻ như tôi đang hỏi ý kiến chủ quan, nhưng đó không phải là những gì tôi theo đuổi. Tôi rất thích nghe một số lập luận có căn cứ về chủ đề này.
Với hy vọng có được cái nhìn sâu sắc về cách thiết kế một luồng / tuần tự hóa hiện đại nên được thiết kế, gần đây tôi đã có cho mình một bản sao của cuốn sách Standard C ++ IOStreams và Locales của Angelika Langer và Klaus Kreft . Tôi hình dung rằng nếu IOStreams không được thiết kế tốt, thì nó sẽ không đưa nó vào thư viện chuẩn C ++ ngay từ đầu.
Sau khi đọc các phần khác nhau của cuốn sách này, tôi bắt đầu nghi ngờ liệu IOStream có thể so sánh với ví dụ STL theo quan điểm kiến trúc tổng thể hay không. Đọc ví dụ cuộc phỏng vấn này với Alexander Stepanov ("nhà phát minh" của STL) để tìm hiểu về một số quyết định thiết kế đã đi vào STL.
Điều làm tôi ngạc nhiên đặc biệt :
Dường như chưa biết ai chịu trách nhiệm cho thiết kế tổng thể của IOStreams (tôi rất muốn đọc một số thông tin cơ bản về điều này - có ai biết tài nguyên tốt không?);
Khi bạn đi sâu vào bên dưới bề mặt ngay lập tức của IOStreams, ví dụ: nếu bạn muốn mở rộng IOStream với các lớp của riêng mình, bạn có thể đến một giao diện với các tên hàm thành viên khá khó hiểu và khó hiểu, ví dụ
getloc
/imbue
,uflow
/underflow
,snextc
/sbumpc
/sgetc
/sgetn
,pbase
/pptr
/epptr
(và có thậm chí có thể là ví dụ tồi tệ hơn). Điều này làm cho nó trở nên khó khăn hơn nhiều để hiểu thiết kế tổng thể và cách các bộ phận đơn lẻ hợp tác. Ngay cả cuốn sách tôi đã đề cập ở trên cũng không giúp được gì nhiều (IMHO).
Vì vậy, câu hỏi của tôi:
Nếu bạn phải đánh giá theo các tiêu chuẩn kỹ thuật phần mềm ngày nay (nếu thực sự có bất kỳ thỏa thuận chung nào về những điều này), liệu IOStream của C ++ có còn được coi là được thiết kế tốt không? (Tôi sẽ không muốn cải thiện kỹ năng thiết kế phần mềm của mình từ một thứ thường bị coi là lỗi thời.)
std::streambuf
là lớp cơ sở để đọc và ghi byte và istream
/ ostream
được định dạng trong và đầu ra, lấy một con trỏ std::streambuf
làm đích / nguồn của nó.
ostream foo(&somebuffer); foo << "huh"; foo.rdbuf(cout.rdbuf()); foo << "see me!";