Автор: Sergey Teplyakov

Картинка в visio, в pdf.

Ни у кого не возникало мыслей, что System.IO в наших с вами дот нетах проектировали специально, чтобы максимально запутать бедных программистов? Вот я, например, постоянно путаюсь между этими TextReader-ами, StreamReader-ами, StringReader-ами, классами FileStream и System.IO.File и т.п.. Поэтому я решил сделать небольшую шпаргалку для себя, но она может быть полезна и кому-то еще.

Итак, вот она:

image

Чтобы было проще разбираться в множестве этих классов, я выделил несколько категорий типов, которые решают разные задачи:

  1. Непосредственно стримы с данными (FileStream, MemoryStream etc): позволяют работать с файлами, сокетами, памятью как с потоком данных бинарных данных
  2. Декораторы (BufferedStream, GZipStream etc): добавляют поведение стримам, типа буферизации или сжатия.
  3. Адаптеры (текстовые TextReader/Writer и бинарные BinaryReader/Writer): служат для упрощения чтения специфических данных из стримов, таких как чтение текстовых данных или выкусывание примитивных данных из бинарного потока.
  4. Фасадный класс с набором фабричных методов System.IO.File (на рисунке не показан)

Классы StreamDecorator и DataStream не существуют, их я выделил чтобы проще было показывать 'общность' классов.

Класс File является таким себе фасадом и содержит набор вспомогательных методов для чтения/записи и манипулирования файлами, но в данном случае наиболее важными являются следующие фабричные методы:

image

Встроенная поддержка тестируемости

Обратите внимание, что на диаграмме выше кроме классов, работающих со стримами есть еще пара классов (StringReader и StringWriter), которые работают со строками в памяти.

Благодаря этому, вы можете обеспечить тестируемость любых классов, работающих со стримами. Если у вас есть класс, читающий что-либо из файла, то вместо открытия файла напрямую, ваш класс может принимать Stream, а еще лучше, TextReader, который легко можно будет 'замокать' передав вместо него StringReader с нужным содержимым.

Этому подходу следуют многие классы .NET Framework, как XmlReader/XmlWriter, XElement/XDocument и многие другие. По сути, TextReader является такой себе стратегией, передача которой через конструктор или метод обеспечит как разделение ответственности между классами, так и требуемую тестируемость.

Помогла статья? Оцените её!
0 из 5. Общее количество голосов - 0
 

You have no rights to post comments

Дмитрий Крикунов

Публикую статьи, обучающие курсы и новости по программированию: алгоритмам, языкам (С++, Java), параллельному программированию, паттернам и библиотекам (Qt, boost).