Обзор книги «Паттерны проектирования на платформе .NET»

    Как известно, недавно была опубликована книга по паттернам проектирования за авторством Сергея Теплякова.

    Дабы поддержать мною уважаемого нашего разработчика (сам Сергей, несмотря на переезд заграницу, всё ещё считает себя нашим — за пруфом идите к нему в блог), не пожалел денег и сразу же купил электронную версию. До этого я читал банду четырёх и Design Patterns Head First, поэтому, в принципе, есть с чем сравнить.
    Книга занимает чуть более 300 страниц, что вполне можно осилить за неделю неторопливого чтения. Книга разбита на 4 части:
    1. Паттерны поведения
    2. Порождающие паттерны
    3. Структурные паттерны
    4. Принципы проектирования

    Разбиение паттернов на такие группы уже давно устоялось и прижилось. В отличие от банды четырёх в книге Сергея есть глава, посвящённая SOLID-принципам проектирования (собственно, в книге банды четырёх этих принципов в том виде, в котором мы с ними знакомы и быть не могло, поскольку были сформулированы позже). В книге банды четырёх есть практическая глава, которая иллюстрирует паттерны на примере разработки текстового редактора. На протяжении всего текста в качестве примеров Сергеем используются проблемы, возникающие при разработке приложения по обработке логов (как я понял, тема близкая к тому, чем сейчас занимается Сергей в компании Майкрософт). Отдельной практической главы, как в случае с бандой четырёх нет. В принципе, автору неплохо удаётся разбирать паттерны на таком примере, однако, хотелось бы заметить, что всё даётся слишком легко, то есть, по ходу повествования особых проблем не возникает — всё ложится как по маслу. Скорее всего, так и было задумано при написании, но мне показалось не очень приятным, что нигде нет челленджа (извините, за варваризм). Пример с текстовым редактором выглядит поинтереснее, на мой взгляд. К недостаткам книги я это замечание отнести напрямую, конечно же, не могу.

    Эта книга — тот редкий случай, когда я просто взял книгу и прочитал её от начала и до конца. И должен вам сказать, что книга читается очень и даже очень легко. Конечно, разработчик, только начавший своё ознакомление с паттернами, вряд ли сможет так беззаботно прочитать всю книгу, но, думаю, что для новичка всё равно трудно представить книгу более простую для понимания, чем эта. Более глубокому пониманию паттернов способствует стиль и форма изложения, выбранная автором: книга во многом является отражением собственного опыта, а не тупой компиляцией чужих мыслей, и это очень импонирует. Примеры, несмотря на то, что выбранный тип приложения мне не очень понравился, всё равно хороши и со своей задачей справляются. Для не новичков может оказаться интересным сравнить свой опыт с авторским. Зачастую я находил подтверждения своим собственным мыслям, которые мне не с кем было обсудить. Поэтому, лично у меня, в процессе чтения книги постоянно происходил внутренний диалог с автором.

    Что касается целевой аудитории книги, то хотелось бы заметить, что хоть в .NET и есть множество собственных плюшек, но таких плюшек, которые оказывали бы огромное влияние на форму паттернов совсем мало. С разбегу могу вспомнить только то, что в .NET можно сделать явную реализацию интерфейса и упростить некоторые паттерны, используя делегаты. Ну и да — нет множественного наследования, что, например, Боб Мартин считает, по сути, косяком команды .NET, поскольку «deadly diamond of death» не настолько страшен, как его малюют, зато множественное наследование в некоторых случаях может оказаться очень полезным (хотя, случается это не сказать, чтобы часто). Поскольку особенностей платформы .NET не так много, то книгу могут читать все кто интересуются паттернами, в независимости от языкаисповедания.

    Автор приводит классические диаграммы паттернов, которые густо используют наследование, но очень часто даёт упрощённые варианты, поскольку в классическом виде паттерны используются достаточно редко. В целом, автор не забывает указать, что не следует вслепую использовать паттерны и учит включать мозг, танцуя от задачи и требований. Отмечу также, немаловажным является то, что использование паттернов рассматривается в связке с написанием unit-тестов.

    В теме, где Сергей анонсировал то, что он пишет книгу, нашлись люди, которые не преминули сказать, что «паттерны — фигня, вот обчитаются люди, а потом делают фабрики фабрик фабрик фабрик с мегафасадами и ещё 100500 паттернов там, где не надо, зачем все эти книги по паттернам, все эти паттерны и так понятны». По моему скромному мнению, большая часть таких людей пишет нечитабельный underengineered говнокод, который потом переписывают по тысяче раз. Это раз. Во-вторых, да, бездумное применение паттернов — плохо и в хорошей книге об этом тоже написано. Программирование это инженерия, а в инженерии нет серебряных пуль и универсальных ответов на все вопросы. Поэтому хорошие программисты всегда взвешивают, что они ставят на кон и что готовы принести на алтарь сложности в целях решения задачи. К сожалению, не бывает книг, которые учат такому искусству (если кто такие видел — поделитесь), ибо достичь понимания того, как соблюсти баланс между сложностью, простотой и мощностью решений можно только с помощью многих лет упорных тренировок на реальных задачах.

    Мне понравилась в книге мысль о том, что следование (даже правильное и хорошее следование) всем принципам не даёт гарантии достижения шикарного дизайна приложения. Всё зависит от задачи, от того как ООП ляжет на такую задачу, в конце-то концов.

    В книге не рассмотрены следующие классические паттерны: «bridge», «flyweight», «memento», «prototype».
    Паттерн «prototype» довольно тупой и реализуется через ужасный ICloneable (не даёт понимания того, что это за копия — глубокая или поверхностная), хотя, реализацию, конечно, можно улучшить. Может быть, поэтому этот паттерн был исключён из книги. Остальные паттерны достаточно интересны и я не знаю, почему они были исключены из рассмотрения. В книге также не рассматриваются всякие «составные» паттерны, типа MVC, MVP, MVVM. Вернее, они затрагиваются мимолётом, но автор в них не углубляется, и, думается, это правильно, поскольку каждому из них можно посвятить отдельную книгу.

    Одним из немногих моментов, где я не совсем согласен с автором явился момент насчёт выброса недекларированных исключений наследниками, если эти исключения не прописаны в контракте базового класса, или не указаны в XML-комментариях в соответствующем разделе. Указывать возможные исключения, декларировать их в контрактах (я не пользовался контрактами, но по книге понял, что задекларировать возможные типы исключений можно) — не является плохой практикой, но это особо ничего не даёт, кроме ложной уверенности в том, что из вызываемого кода будут лететь только задекларированные исключения. Сколько вы методов видели в BCL, которые лезут, скажем, в файловую систему и декларируют все типы возможных исключений? Правильно, таких методов нет. От концепции проверяемых исключений разработчики .NET отказались изначально. Система обработки ошибок через исключения по-прежнему является большим и жирным геморроем для тех, кто хочет разрабатывать стабильные приложения. Для правильной обработки ошибок через исключения требуется многое: грамотное построение архитектуры, грамотное выделение типов исключений, грамотное написание тестов, контрактов и прочее. Если хотя бы в одной из этих сфер у команды разработчиков есть проблемы, то приложение будет падать с завидной регулярностью, причём зачастую от всяких «безобидных исключений», когда работу можно было бы и продолжить.

    В заключение хотелось бы сказать спасибо Сергею за замечательную книгу, пишите ещё! По десятибалльной шкале я бы оценил книгу в 8-8.5.
    • +17
    • 24,3k
    • 9
    Поделиться публикацией

    Комментарии 9

      +1
      Купил электронную книгу сразу после новости. Прочитал за 2-3 дня не отвлекаясь от работы.
      Да читается очень легко, даже наверно легче Head First Design Patterns.
      Единственное что не понравилось, это не однократные отсылки к сайту автора, для просмотра статей по некоторым темам.
        +2
        Единственное что не понравилось, это не однократные отсылки к сайту автора, для просмотра статей по некоторым темам.

        Ну, не знаю, как по мне — всё зависит от отношения к этому. На мой взгляд, продвижение себя — хорошая, здоровая практика. Тем более, что ссылок на другие источники более, чем достаточно.
          +4
          Всё проще: книга составлена на основе постов в блоге Сергея, и в них он ссылается на другие посты. Просто первые вошли в книгу, а вторые нет.
          0
          Небольшой опыт написания книг показал, что этот процесс достаточно сложен и очень сильно напоминает разработку софта. Нужно найти определенный балланс между тем, что давать, о чем упоминать и на что забить. Молодые авторы (книг, блогов, тренингов) обычно стараются впихнуть максимальный объем материала по принципу — чем больше, тем лучше. Подход хорош для автора, но не всегда подходит читателю, которому теперь придется перескакивать с темы на тему (получаем low cohesion и нарушение SRP). С другой стороны, забить совсем — тоже не хорошо, поскольку связь у двух тем все же присутствует. В результате и появляется большое число перекрестных ссылок:)
          +1
          Я купил бумажную версию книги, тоже сразу после анонса. Книга мне понравилась, хотя не могу не согласится с ТС, что основной пример книги(logging) чисто с точки зрения восприятия, возможно выбран не очень удачно, хотя с логической точки зрения и с точки зрения обучения к нему претензий нет.

          Особое спасибо автору за то что описал и внес ясность насчет нескольких часто путаемых определений, например DI vs IoC vs DIP.

          P.S.
          EngineerSpock книге всё же рассматривается паттерн «chain of responsibility»
            +1
            Таки да, паттерн «chain of responsibility» был затронут. Спасибо. Статью поправил.
            +1
            Спасибо за обзор. Буквально сегодня взял эту книгу в бумажном виде, пришел на работу и увидел пост. Судя по всему не прогадал.

            PS: в интернет магазине ИД «Питер» бумажного варианта нет и, судя по небольшому тиражу, не предвидится (хотя в писье высланном на почту буквально позавчера они и предлагают купить ее за 500 ₽).
              0
              Не за что, спасибо автору :)
              Конечно, обзор это всегда во многом ИМХО, но я надеюсь, что толика объективности в обзоре всё же присутствует.
              +1
              Прочитал за неделю неспешным темпом. Книга очень понравилась, все доступно и понятно описано. Читается легко. Спасибо автору.

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое