Öncelikle, öznel görüşler istiyormuşum gibi görünebilir, ama peşinde olduğum şey bu değil. Bu konuyla ilgili bazı sağlam temelli argümanlar duymak isterim.
Modern bir akış / serileştirme çerçevesinin nasıl tasarlanması gerektiğine dair biraz fikir edinme umuduyla, kısa süre önce kendime Angelika Langer ve Klaus Kreft tarafından yazılan Standard C ++ IOStreams and Locales kitabının bir kopyasını aldım . IOStreams iyi tasarlanmış olmasaydı, ilk etapta C ++ standart kitaplığına girmeyeceğini düşündüm.
Bu kitabın çeşitli bölümlerini okuduktan sonra, IOStreams'in genel mimari bakış açısından örneğin STL ile karşılaştırılıp karşılaştırılamayacağı konusunda şüphelerim olmaya başladım. Örneğin , STL'ye giren bazı tasarım kararları hakkında bilgi edinmek için Alexander Stepanov (STL'nin "mucidi") ile yapılan bu röportajı okuyun .
Beni özellikle şaşırtan şey :
IOStreams'in genel tasarımından kimin sorumlu olduğu bilinmiyor gibi görünüyor (bununla ilgili bazı arka plan bilgilerini okumak isterim - iyi kaynakları bilen var mı?);
IOStreams'in hemen yüzeyinin altına indiğinizde, örneğin IOStreams'i kendi sınıflarınızla genişletmek istiyorsanız, oldukça şifreli ve kafa karıştırıcı üye işlev adlarının bulunduğu bir arayüze ulaşırsınız, örneğin
getloc
/imbue
,uflow
/underflow
,snextc
/sbumpc
/sgetc
/sgetn
,pbase
/pptr
/epptr
(ve muhtemelen daha da kötü örnekler). Bu, genel tasarımı ve münferit parçaların nasıl birlikte çalıştığını anlamayı çok daha zor hale getirir. Yukarıda bahsettiğim kitap bile o kadar yardımcı olmuyor (IMHO).
İşte sorum şu:
Eğer (aslında orada eğer bugünün yazılım mühendisliği standartlarına göre yargıç olsaydı olduğunu Bunlarla ilgili herhangi genel bir mutabakat), C ++ 'ın hala iyi tasarlanmış olarak kabul edilebilir IOStreams ki? (Yazılım tasarım becerilerimi genellikle modası geçmiş bir şeyden geliştirmek istemem.)
std::streambuf
bayt okuma ve yazma için temel sınıftır ve istream
/ ostream
biçimlendirilmiş giriş ve çıkış içindir, std::streambuf
hedef / kaynak olarak bir gösterici alır .
ostream foo(&somebuffer); foo << "huh"; foo.rdbuf(cout.rdbuf()); foo << "see me!";