среда, 23 июля 2014 г.

Еще одна книга по паттернам? Дайте две!

Привет, читатель! Я хочу поговорить с тобой о паттернах проектирования. Знаешь, это такая старая штука, о которой модно было писать в конце прошлого века, и некоторые изверги о них еще иногда спрашивают на собеседованиях. У меня возникла мысль, что пришла пора снова вспомнить о них, но на этот раз рассмотреть их в современных реалиях. А разве есть более подходящий способ это сделать, кроме как взять ... и написать об этом книгу?

clip_image002


Почему сейчас и почему о паттернах? За последние 20 лет довольно много чего произошло с современными подходами к разработке. В начале девяностых был бум паттернов, потом пришел черед DI и "программирования в файлах конфигурации", потом начался хайп вокруг DDD, в это же время стремительно начали набирать популярность техники функционального программирования. Сделало ли все это паттерны неактуальными? С моей точки зрения, нет, не сделало!

Хайп вокруг паттернов действительно прошел, и пришло время посмотреть на них с высоты нашего опыта. Для одного паттерны утратили свою актуальность, а для другого синглтон остается нашим всем. В своей книге я хочу взять какой-нибудь паттерн и рассмотреть его со всех возможных сторон: посмотреть, как он выглядит в книге "банды четырех", рассмотреть его "каноническое" современное представление, рассмотреть 3-4 типичные реализации на языке C#, подумать, как он влияет на дизайн приложения, ну и посмотреть на примеры их применения в .NET Framework и в современных приложениях.

Например, если говорить о богомерзком Синглтоне, то я приведу 4 разных реализации на платформе .NET, покажу чем классический Синглтон отличается от паттерна Ambient Context, и покажу "где" и "в каком виде" он применим в современном приложении.

Или возьму фабричный метод и рассмотрю его не только с точки зрения классической реализации, но и отвечу на вопрос, нарушает ли фабричный метод на основе словаря или switch-а принцип Открыт-Закрыт. Потом перейду к Шаблонному Методу и рассмотрю его в контексте проблем наследования и принципов проектирования по контракту, а потом сравню классический Шаблонный Метода со специфической реализацией в C# на основе лямбда-выражений.

Когда я возьму Посетитель, то не только покажу, где и когда он применяется, но и расскажу об известной проблеме программной инженерии под названием expression problem, о типичных подходах к расширяемости в мирах объектно-ориентированного и функционального программирования, о роли паттерна Посетитель в контексте принципа Открыт/Закрыт.

Я расскажу о «строителях» не просто на примерах диаграмм классов из банды четырех, а в несколько ином контексте, например, для создания тестовых данных для юнит и интеграционных тестов.

Хочется не просто рассказать о паттернах, со скучными каноническими диаграммами классов, некоторые из которых невозможно встретить в реальном коде. Хочется взять ключевые GoF-паттерны и показать, как они эволюционировали, как они обычно реализуются на языке C#, и как сильно они въелись в сам .NET Framework и наши с вами пальцы.

А к чему это я веду? Дело в том, уважаемый Читатель, что мне нужна твоя помощь. Издатель (в лице издательского дома Питер) готов взяться за эту книгу, но ему нужно мнение сообщества по поводу актуальности ее актуальности (это не очепятка!). Мы-то с вами готовы жертвовать своим временем в ущерб семьи и других интересов, но бизнес следует несколько иным принципам.

clip_image004

Так что, уважаемые камрады (и камрадки), если вам хотелось бы увидеть эту книгу в печатном виде, то отреагируйте как-нить в комментах или другим удобным способом.

З.Ы. Если нужно содержание книги, то я готов его выложить, хотя оно будет мало чем отличаться от содержания классической книги банды четырех, с некоторыми ответвлениями. С примерами же содержимого можно ознакомиться в первом сообщении серии постов о паттернах – “GoF паттерны на платформе .NET”.

З.Ы. Понравился пост? Поделись с друзьями! Вам не сложно, а мне приятно;)

68 комментариев:

  1. Отличная идея.
    Действительно дайте две.
    Особенно если паттерны разбавить такими аспектами как их применимость в тестах,солид-ом и т.д.

    ОтветитьУдалить
  2. Сергію, згоден, якщо зібрати Ваші статті по паттернах і видати книгою - буде супер!

    Питання:
    1. Ви впевнені, що варто возитися з папером? Зараз більшість читають з планшета/читалки/телефона, не простіше обмежитися електронним виданням?
    2. Чому Пітер російською? Можна спробувати той же Маннінг, де публікувалися Скіт і Зеєман - англійською і аудиторія більша. Не факт, що одразу візьмуть, але спробувати можна.

    В будь-якому разі ідея класна, тримайте в курсі справи будь ласка :)

    ОтветитьУдалить
    Ответы
    1. 1. Я очень рассчитываю на наличие электоронной версии книги.
      2. Для меня проще, поскольку я могу в разумные ближайшие сроки получить готовый результат. Публиковать на английском лучше, но это потребует существенно больше усилий, и я боюсь, что я просто переключусь на что-то другое и не доведу дело до конца!

      И спасибо за поддержку!!!

      Удалить
  3. Если в разных вариантах может получиться слишком много материала. На сколько страниц книга расчитана?

    ОтветитьУдалить
    Ответы
    1. Думаю, страниц на 400-500. Вряд ли меньше будет.

      Удалить
  4. Отличная идея, я еще месяц назад подумал - почему этот парень не напишет книгу с его багажом.
    Это будет отличный труд для нас, и в общем то не слабый труд для писателя.
    Дай бог Вам сил и времени.))

    ОтветитьУдалить
    Ответы
    1. Спасибо за поддержку! Постараюсь не подвести:))

      Удалить
  5. +1 За такую книгу. Хорошая идея!

    ОтветитьУдалить
  6. Взял бы без раздумий. Только, правда, электронный вариант по причине моего возможного перемещения. Бумажный вариант, думаю будет идти долговато. Вообще свежий взгляд на паттерны сегодня это то чего не хватает сейчас довольно сильно. Так что очень жду.

    ОтветитьУдалить
  7. Купил бы как минимум только из-за авторства

    ОтветитьУдалить
  8. Отличная идея, если появится в продаже куплю с удовольствием.

    ОтветитьУдалить
  9. «Реагирую как-нить в комментах» :) А будет пример, раздел из главы? То есть сферический разбор какого-нибудь шаблона со всеми полетами. Электронные версии книги неизбежны.

    ОтветитьУдалить
    Ответы
    1. Электронная книга должна быть. Я-то и сам читаю сейчас исключительно в электронном виде, так что без них сейчас никуда.

      Удалить
    2. В цьому блозі маса прикладів

      Удалить
  10. На какой уровень подготовки читателя будет рассчитана книга?

    ОтветитьУдалить
    Ответы
    1. Med+. Примерно тот же, что и требуется для чтения других моих статей по дизайну.

      Удалить
  11. С удовольствием читаю блог, большое спасибо за ваш труд. Если выйдет книга, где так же подробно да ещё и с примерами на С# будут разобраны паттерны, то обязательно "проголосую рублём"

    ОтветитьУдалить
  12. С интересом читаю Ваш блог. Если будет еще и книга, то обязательно приобрету.

    ОтветитьУдалить
  13. +1, если примеров использования паттернов будет больше чем 2, т.е. ничего заумного не нужно, просто после общего описания примеры использования на "реальных объектах".
    Например, если говорим о "стратегии":
    1) "представим задачку расчета выплат, где есть общая схема, но для каждого конкретного расчета изменяется источник надбавочных коэффициентов. Решение с использованием стратегии могло бы выглядеть так: ..."
    2) "представим задачку формирования отчета о результатах измерений, форма отчета одинаковая, но данные получаются с разных приборов, используя стратегию мы опишем логику формирования отчета, а забор данных реализуем в потомках: ..."
    Я хочу сказать, что такие книги изучают разные люди, с разным уровнем абстрактного мышления. Сейчас, чтобы объяснить, приходится давать книгу, а потом у доски с маркером придумывать примеры.
    Тем более, что автор может с ходу привести три примера из своего опыта. И не стоит бояться этого делать, я считаю.

    З.Ы. и да, я пронимаю, почему такого стараются не делать, но таких книг уже и правда достаточно.

    ОтветитьУдалить
  14. Успехов вам в этом деле! Поддерживаю вашу инициативу.

    ОтветитьУдалить
  15. Нравится идея, GoF паттерны действительно эволюционировали и пора выложить переосмысленное их понимание с хорошими современными примерами.
    +1 короче к потенциальному читателю.

    ОтветитьУдалить
  16. Если смотреть с точки зрения бизнеса, надо делать упор не на профи, а на новичков, просто потому что их больше.

    ОтветитьУдалить
    Ответы
    1. Я не всегда отталкиваюсь с точки зрения бизнеса. Например, я развиваюсь не из-за экономических выгод в будущем, а потому что мне интересно, а экономическая выгода уже приходит позднее. С книгой тоже самое: для меня это не вопрос экономической выгоды, коей не будет вовсе, а вопрос приятного времяпрепровождения и собственного удовольствия от создания чего-то интересного.

      Так что в этом случае в качестве аудитории будет все же адвансд читатель, нежели новичок.

      Удалить
    2. Издательство то отталкивается от бизнеса. Понятно что книга в любом случае будет не для новичка не в программировании, но относительно проектирования хотелось бы чтобы ваш опыт стал максимально доступен. Я сейчас читаю ваши статьи 2012 года и там много сложных терминов, не сточки зрения программирования, а именно для понимания их в отсутствии примеров.

      Удалить
    3. А можно пример по поводу непонятных терминов?

      Удалить
  17. Плюсую. Книгу бы непременно купил.

    ОтветитьУдалить
    Ответы
    1. +1. Куплю обязательно. Желательно чтобы была также электронная версия

      Удалить
  18. Ребята, всем огромное спасибо за отзывы. Я так понимаю, что вопрос актуальности снимается. Теперь нужно утрясти оставшиеся детали с издательством!

    Буду держать всех в курсе дела!

    ОтветитьУдалить
  19. Сергей, пишите обязательно! Я очень надеюсь на всесторонний охват темы с учетом тонких моментов, мнений "за" и "против" (сколько копий сломано в святых войнах по поводу Singleton или Repository...), с максимально практическими выводами и материалом для размышлений. Другими словами, я за упор на хардкор. А для новичков отлично подойдет Head First Design Patterns.

    P.S. Только паттерны от GoF будете рассматривать? Ambient Context явно не оттуда :)

    ОтветитьУдалить
    Ответы
    1. На самом деле Ambient Context описан в GoF, но его там никто не видит;)
      Но в основном упор будет на GoF и очень близкие к ним паттерны (или их разновидности).

      Удалить
  20. Сергей,
    рад, что Ваш дао привел вас к мысли о создании книги! С удовольствием прочту и проголосую рублем.

    Я за оба варианта - бумажный и электронный.

    ОтветитьУдалить
    Ответы
    1. Антон, спасибо.
      Да, я думаю будет оба варианта.

      Удалить
  21. Великолепный блог, думаю книга будет такая же, с удовольствием куплю и прочту.

    P.S. Спасибо за третьего Скита.

    ОтветитьУдалить
    Ответы
    1. Сергей, спасибо.
      P.S. А вот по поводу Скита ждите отдельной заметки в Г+, нам не все так просто.

      Удалить
  22. Первый в очереди на книгу... Когда примерно можно ждать?)

    ОтветитьУдалить
  23. Отличная новость! С удовольствием приобрету книгу!

    ОтветитьУдалить
    Ответы
    1. ЗЫ: Если добавите еще паттерны для многопоточного программирования, цены книге не будет!

      Удалить
    2. Александр, паттерны для многопоточного программирования - это отдельная и очень серьезная тема, так что в этот раз о них ничего не будет:(

      Удалить
  24. Сергей, безусловно, написание книги по паттернам - это отличная идея, полностью в этом вас поддерживаю.
    Меня интересую один момент - на сколько книга будет привязана к платформе .NET? Дело в том, что мой основной язык программирования - Java, в связи с чем и возник вопрос выше. То есть можно написать книгу, где для примеров будет использоваться определенный язык программирования, но и при этом основные идеи от него не будут зависеть. А можно написать с использованием специальных возможностей языка, фреймворка и т.д.

    ОтветитьУдалить
    Ответы
    1. Дмитрий, чтобы понять примерное содержимое книги достаточно глянуть на одну из статей по паттерном (можно начать с GoF паттерны на платформе .NET.

      В целом, там есть несколько разделов: взгляд на классический паттерн в современных реалиях, его влияние на дизайн и .NET-специфик часть. Последнее играет достаточно важную роль, поскольку специфика может быть довольно существенной. В некотором случае можно легко найти аналоги из мира Java, а в некотором случае особенности будут исключительно платформенно-зависимыми.

      Т.е. зависеть от языка повествование таки будет.

      Удалить
  25. Ну наконец-то! Где подписать? Будем спрашивать на собеседованиях: Что читал? Рихтер, Тепляков, Фаулер?

    ОтветитьУдалить
    Ответы
    1. Денис, как будет у меня печатный экземпляр, вышлю тебе лично обязательно:))

      Удалить
  26. + 1 за книгу! Обязательно куплю, и даже прочитаю!

    Заклинило мозг от размышлений, чем Ambient Context отличается от Singleton :) Я так понимаю, что синглтон - это один из способов реализации контекста?

    ОтветитьУдалить
    Ответы
    1. Михаил, спасибо.

      Я скоро возобновлю публикацию статей по паттернам, давайте сохраним интригу))))

      Удалить
  27. Обязательно купил бы такую книгу. Читаю ваши статьи с удовольствием.

    ОтветитьУдалить
  28. Хорошая идея. Правильная. Нужная.

    Только можно мнение?

    Тут по-моему уместно спрашивать - не "НУЖНА ли книга", а "КТО из ВАС её купит".

    Ибо, программисты (простите уж) привыкли иметь ВСЁ И СРАЗУ и НАХАЛЯВУ, т.е. "купить конечно можно", но лучше - СКАЧАТЬ.

    Стоит оно того? Не знаю. Я сам -- давно мучаюсь подобным вопросом.

    Я скажу ЗА СЕБЯ - Я БЫ КУПИЛ.

    Более того - я ЛИЧНО готов "помочь", ну там "советом" (хотя он вряд ли нужен) или "вычиткой" (хотя куда мне с моими Delphi казалось бы), а лучше - ФИНАНСОВО, а лично готов "влить" какое-то количество денег. Зачем? Ну чтобы сделать "мир программирования лучше" :-)

    Я бы кстати на вашем месте организовал бы "подписку" - пусть КАЖДЫЙ желающий "занесёт" скромную сумму, ну например - "рубль" - и тогда сразу станет ясно - сколько потенциально людей "готовы купить".

    Простите, если кого обидел.

    P.S. а про подобную книгу, но "про Delphi" - сам давно думаю. Правда придерживаюсь мнения что "язык не важен". Для ЧИТАЮЩЕГО. Но не для ПИШУЩЕГО. Ибо пишущий он "силён конкретным опытом". А ЧИТАЮЩИЙ может "считать" и "опыт вообще".

    ОтветитьУдалить
    Ответы
    1. Александр, спасибо!
      Идея и правда интересная (по поводу организации некоего фонда). Для меня, честно говоря, финансовый вопрос не сильно важен, но как дополнительный стимул (раз люди поддержали, значит нужно довести дело до конца), вполне ок.

      И спасибо за желание по поводу вычитки, с удовольствием его приму!

      З.Ы. Как только утрясем с издателем, я постучу ко всем, проявившим желание помочь с вычиткой;)

      Удалить
    2. "Как только утрясем с издателем, я постучу ко всем, проявившим желание помочь с вычиткой"
      -- да не вопрос. Всегда готов.

      Удалить
  29. Я за! Давно хотел получить твой блог в распечатке )

    ОтветитьУдалить
  30. +1! И ещё +1 за электронную версию.

    ОтветитьУдалить
  31. Этот комментарий был удален автором.

    ОтветитьУдалить
  32. +1 за книгу, особенно печатный вариант. Купил бы и советовал другим! Очень нравится ваш стиль изложения!

    ОтветитьУдалить
  33. Сергей, давно уже жду, когда же выйдет твоя книга! +1! Издательство "Питер" даже не знаю, чего думает. Надо издавать - однозначно. Жду экземпляр с автографом автора (шутка) :)

    ОтветитьУдалить
  34. Читать обязательно буду сам и коллегам посоветую.
    Дерзайте!

    ОтветитьУдалить
  35. Готов купить бумажный вариант книги хотя бы только из-за автора. Да и материал наверняка будет отличный.

    ОтветитьУдалить
  36. Если в течении года появится электронная версия - куплю обязательно.

    ОтветитьУдалить
  37. Отличная идея, Сергей. Книгу куплю обязательно.

    ОтветитьУдалить
  38. Начал читать сейчас Вашу книгу.... :)
    Сейчас на главе о Template method. Паттерн сам по себе довольо таки простой. Но не понятен вариант реализации в C# через делегаты... Я пишу на Java - там нет делегатов. Есть возможность привести пример на Java?
    И чуть погуглил... Возник вопрос: Чем такой делегат отличается от DI? Я ж могу и реализацию подменить через set-метод...

    ОтветитьУдалить
    Ответы
    1. На джаве без делегатов нужно использовать классическую версию с наследованием.
      Либо ждать Java 8 (или 9), в которой появятся анонимные функции.

      > Чем такой делегат отличается от DI? Я ж могу и реализацию подменить через set-метод...

      Делегат вообще не отличается ничем от интерфейса с одним методом.

      Удалить
  39. Время от времени возвращаюсь к разным главам книги. И сейчас решил выяснить все-таки один вопрос у автора (на SO подобный вопрос задал, но не получил ответа, который бы меня устроил).
    Вот код:
    public class SqlServerLogSaverAdapter : ILogSaver
    {
    private readonly SqlServerLogSaver _sqlServerLogSaver = new SqlServerLogSaver();
    public void Save(LogEntry logEntry)
    {
    var simpleEntry = logEntry as SimpleLogEntry;
    if (simpleEntry != null)
    {
    _sqlServerLogSaver.Save(simpleEntry.EntryDateTime,
    simpleEntry.Severity.ToString(),
    simpleEntry.Message);
    return;
    }
    var exceptionEntry = (ExceptionLogEntry)logEntry;
    _sqlServerLogSaver.SaveException(exceptionEntry.EntryDateTime,
    exceptionEntry.Message,
    exceptionEntry.Exception);
    }
    }

    Уместно ли в этом коде приведение типов? Нужно ли от него избавиться? И если да, то как это сделать правильней всего?

    ОтветитьУдалить
    Ответы
    1. Виталий, здравствуй. Если ты дашь вопрос на SO, то я там продублирую ответ.

      Идея приведения типов в данном случае оправдана тем, что иерархия LogEntry представляет собой иерархию объектов-данных. При этом каждый тип наследника обладает дополнительными свойствами.

      Это довольно популярный подход в функциональных языках программирования, таких как F#, в которых есть встроенная поддержка discriminated union и pattern matching-а. В C# 8, будет pattern matching на основе типов, что сделает этот код более красивым.

      З.Ы. Есть ряд книг, которые пишут о том, что downcasting - это зло. Но там нужно понимать контекст. Даункастить объекты с поведением действительном может быть не очень, особенно, если это делается часто.

      З.Ы.Ы. И еще: тут, по сути, происходит double dispatch, когда у нас есть две иерархии объектов - иерархия log entries, и иерархия LogSaver-ов. В этом случае, полностью избавиться от приведения типов довольно сложно.

      Удалить
    2. Сергей, привет. Вот ссылка.
      https://softwareengineering.stackexchange.com/questions/351168/best-practice-to-avoid-or-refactor-casting-base-type-to-derived-class
      Я там много комментариев оставил, но так и не добился понятного ответа.
      Спасибо тебе большое за разъяснение и за книгу:)

      Удалить