Я потратил довольно много времени на знакомство с классами .NET Stream. Обычно я многому учусь, изучая дизайн класса профессиональных, коммерческих платформ, но я должен сказать, что что-то здесь не совсем пахнет.
System.IO.Stream - это абстрактный класс, представляющий последовательность байтов. Имеет 10 абстрактных методов / свойств: Read, Write, Flush, Length, SetLength, Seek, Position, CanRead, CanWrite, CanSeek
. Из-за большого количества абстрактных членов становится затруднительным извлекать из-за того, что вам нужно переопределить все эти методы, даже если большинство из них просто бросают NotImplemented
.
Ожидается, что пользователи классов Stream будут звонить CanRead
, CanWrite
или CanSeek
, чтобы выяснить возможности Stream, или, я полагаю, просто пойти дальше и вызвать Read
, Write
или Seek
и посмотреть, если он бросает NotImplemented
. Это только у меня так, или это вялый дизайн?
Хотя есть много гнид, которые я хотел бы выбрать с дизайном класса Stream
, основной вопрос, о котором я хотел бы спросить, заключается в следующем: почему они не использовали интерфейсы, такие как IReadable
, IWriteable
, ISeekable
, вместо этого? Тогда новый класс Stream может изящно наследоваться от интерфейсов, которые он поддерживает. Разве это не объектно-ориентированный способ ведения дел? Или я что-то упустил?
Обновление : было отмечено, что значение CanRead
и др. может измениться во время выполнения - например, если FileStream
закрыто - и точка взята. Тем не менее, я не уверен, что это хороший дизайн. Оттуда, откуда я, попытка чтения из файла, который уже был закрыт, является ошибкой или, по крайней мере, исключительным условием. (И, таким образом, исключение является естественным способом справиться с этой ситуацией.)
Значит ли это, что каждый раз, когда я собираюсь Read
из Stream
, я должен проверять CanRead
? И будет ли это означать, что я должен поставить блокировку на место, чтобы избежать состояния гонки, если возможно, что значение когда-нибудь изменится между вызовом CanRead
и вызовом Read
?
Обновление от 7 августа 2010 г. : Похоже, консенсус здесь заключается в том, что дизайн Stream довольно хорош в его нынешнем виде. Но позвольте мне еще раз спросить, чтобы быть на 100% уверенным: люди пишут что-то подобное каждый раз, когда читают из потока?
// s is a Stream
lock(s)
{
if (s.CanRead)
{
s.Read(buf, 0, buf.Length);
}
}