Я потратил немало времени на знакомство с классами .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
et al может измениться во время выполнения &mdash, например, если a FileStream
закрыто — и точка взята. Однако я не убежден, что это хороший дизайн. Из того, откуда я, попытка прочитать из файла, который уже был закрыт, является ошибкой или, по крайней мере, исключительным условием. (И таким образом бросание исключения - естественный способ справиться с этой ситуацией.)
Означает ли это, что каждый раз, когда я собираюсь Read
из Stream
, я должен проверить CanRead
? И это означало бы, что я должен установить блокировку, чтобы избежать состояния гонки, если возможно, что значение может меняться где-то между вызовом CanRead
и вызовом Read
?
Обновление от 7 августа 2010. Консенсус здесь, похоже, в том, что дизайн Stream довольно хорош в его нынешнем виде. Но позвольте мне спросить еще раз, чтобы быть на 100% уверенным: люди пишут что-то подобное каждый раз, когда они читают из Stream?
// s is a Stream
lock(s)
{
if (s.CanRead)
{
s.Read(buf, 0, buf.Length);
}
}