Я потратил немало времени на знакомство с классами .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);
}
}