Привет, читатель! Я хочу поговорить с тобой о паттернах проектирования. Знаешь, это такая старая штука, о которой модно было писать в конце прошлого века, и некоторые изверги о них еще иногда спрашивают на собеседованиях. У меня возникла мысль, что пришла пора снова вспомнить о них, но на этот раз рассмотреть их в современных реалиях. А разве есть более подходящий способ это сделать, кроме как взять ... и написать об этом книгу?
Почему сейчас и почему о паттернах? За последние 20 лет довольно много чего произошло с современными подходами к разработке. В начале девяностых был бум паттернов, потом пришел черед DI и "программирования в файлах конфигурации", потом начался хайп вокруг DDD, в это же время стремительно начали набирать популярность техники функционального программирования. Сделало ли все это паттерны неактуальными? С моей точки зрения, нет, не сделало!
Хайп вокруг паттернов действительно прошел, и пришло время посмотреть на них с высоты нашего опыта. Для одного паттерны утратили свою актуальность, а для другого синглтон остается нашим всем. В своей книге я хочу взять какой-нибудь паттерн и рассмотреть его со всех возможных сторон: посмотреть, как он выглядит в книге "банды четырех", рассмотреть его "каноническое" современное представление, рассмотреть 3-4 типичные реализации на языке C#, подумать, как он влияет на дизайн приложения, ну и посмотреть на примеры их применения в .NET Framework и в современных приложениях.
Например, если говорить о богомерзком Синглтоне, то я приведу 4 разных реализации на платформе .NET, покажу чем классический Синглтон отличается от паттерна Ambient Context, и покажу "где" и "в каком виде" он применим в современном приложении.
Или возьму фабричный метод и рассмотрю его не только с точки зрения классической реализации, но и отвечу на вопрос, нарушает ли фабричный метод на основе словаря или switch-а принцип Открыт-Закрыт. Потом перейду к Шаблонному Методу и рассмотрю его в контексте проблем наследования и принципов проектирования по контракту, а потом сравню классический Шаблонный Метода со специфической реализацией в C# на основе лямбда-выражений.
Когда я возьму Посетитель, то не только покажу, где и когда он применяется, но и расскажу об известной проблеме программной инженерии под названием expression problem, о типичных подходах к расширяемости в мирах объектно-ориентированного и функционального программирования, о роли паттерна Посетитель в контексте принципа Открыт/Закрыт.
Я расскажу о «строителях» не просто на примерах диаграмм классов из банды четырех, а в несколько ином контексте, например, для создания тестовых данных для юнит и интеграционных тестов.
Хочется не просто рассказать о паттернах, со скучными каноническими диаграммами классов, некоторые из которых невозможно встретить в реальном коде. Хочется взять ключевые GoF-паттерны и показать, как они эволюционировали, как они обычно реализуются на языке C#, и как сильно они въелись в сам .NET Framework и наши с вами пальцы.
А к чему это я веду? Дело в том, уважаемый Читатель, что мне нужна твоя помощь. Издатель (в лице издательского дома Питер) готов взяться за эту книгу, но ему нужно мнение сообщества по поводу актуальности ее актуальности (это не очепятка!). Мы-то с вами готовы жертвовать своим временем в ущерб семьи и других интересов, но бизнес следует несколько иным принципам.
Так что, уважаемые камрады (и камрадки), если вам хотелось бы увидеть эту книгу в печатном виде, то отреагируйте как-нить в комментах или другим удобным способом.
З.Ы. Если нужно содержание книги, то я готов его выложить, хотя оно будет мало чем отличаться от содержания классической книги банды четырех, с некоторыми ответвлениями. С примерами же содержимого можно ознакомиться в первом сообщении серии постов о паттернах – “GoF паттерны на платформе .NET”.
З.Ы. Понравился пост? Поделись с друзьями! Вам не сложно, а мне приятно;)
Отличная идея.
ОтветитьУдалитьДействительно дайте две.
Особенно если паттерны разбавить такими аспектами как их применимость в тестах,солид-ом и т.д.
Саша, спасибо! Буим стараться!
УдалитьСергію, згоден, якщо зібрати Ваші статті по паттернах і видати книгою - буде супер!
ОтветитьУдалитьПитання:
1. Ви впевнені, що варто возитися з папером? Зараз більшість читають з планшета/читалки/телефона, не простіше обмежитися електронним виданням?
2. Чому Пітер російською? Можна спробувати той же Маннінг, де публікувалися Скіт і Зеєман - англійською і аудиторія більша. Не факт, що одразу візьмуть, але спробувати можна.
В будь-якому разі ідея класна, тримайте в курсі справи будь ласка :)
1. Я очень рассчитываю на наличие электоронной версии книги.
Удалить2. Для меня проще, поскольку я могу в разумные ближайшие сроки получить готовый результат. Публиковать на английском лучше, но это потребует существенно больше усилий, и я боюсь, что я просто переключусь на что-то другое и не доведу дело до конца!
И спасибо за поддержку!!!
Если в разных вариантах может получиться слишком много материала. На сколько страниц книга расчитана?
ОтветитьУдалитьДумаю, страниц на 400-500. Вряд ли меньше будет.
УдалитьОтличная идея, я еще месяц назад подумал - почему этот парень не напишет книгу с его багажом.
ОтветитьУдалитьЭто будет отличный труд для нас, и в общем то не слабый труд для писателя.
Дай бог Вам сил и времени.))
Спасибо за поддержку! Постараюсь не подвести:))
Удалить+1 За такую книгу. Хорошая идея!
ОтветитьУдалитьВзял бы без раздумий. Только, правда, электронный вариант по причине моего возможного перемещения. Бумажный вариант, думаю будет идти долговато. Вообще свежий взгляд на паттерны сегодня это то чего не хватает сейчас довольно сильно. Так что очень жду.
ОтветитьУдалитьКупил бы как минимум только из-за авторства
ОтветитьУдалитьОтличная идея, если появится в продаже куплю с удовольствием.
ОтветитьУдалить«Реагирую как-нить в комментах» :) А будет пример, раздел из главы? То есть сферический разбор какого-нибудь шаблона со всеми полетами. Электронные версии книги неизбежны.
ОтветитьУдалитьЭлектронная книга должна быть. Я-то и сам читаю сейчас исключительно в электронном виде, так что без них сейчас никуда.
УдалитьВ цьому блозі маса прикладів
УдалитьНа какой уровень подготовки читателя будет рассчитана книга?
ОтветитьУдалитьMed+. Примерно тот же, что и требуется для чтения других моих статей по дизайну.
УдалитьС удовольствием читаю блог, большое спасибо за ваш труд. Если выйдет книга, где так же подробно да ещё и с примерами на С# будут разобраны паттерны, то обязательно "проголосую рублём"
ОтветитьУдалитьКуплю!
ОтветитьУдалитьС интересом читаю Ваш блог. Если будет еще и книга, то обязательно приобрету.
ОтветитьУдалить+1, если примеров использования паттернов будет больше чем 2, т.е. ничего заумного не нужно, просто после общего описания примеры использования на "реальных объектах".
ОтветитьУдалитьНапример, если говорим о "стратегии":
1) "представим задачку расчета выплат, где есть общая схема, но для каждого конкретного расчета изменяется источник надбавочных коэффициентов. Решение с использованием стратегии могло бы выглядеть так: ..."
2) "представим задачку формирования отчета о результатах измерений, форма отчета одинаковая, но данные получаются с разных приборов, используя стратегию мы опишем логику формирования отчета, а забор данных реализуем в потомках: ..."
Я хочу сказать, что такие книги изучают разные люди, с разным уровнем абстрактного мышления. Сейчас, чтобы объяснить, приходится давать книгу, а потом у доски с маркером придумывать примеры.
Тем более, что автор может с ходу привести три примера из своего опыта. И не стоит бояться этого делать, я считаю.
З.Ы. и да, я пронимаю, почему такого стараются не делать, но таких книг уже и правда достаточно.
Успехов вам в этом деле! Поддерживаю вашу инициативу.
ОтветитьУдалитьНравится идея, GoF паттерны действительно эволюционировали и пора выложить переосмысленное их понимание с хорошими современными примерами.
ОтветитьУдалить+1 короче к потенциальному читателю.
+1
ОтветитьУдалитьЕсли смотреть с точки зрения бизнеса, надо делать упор не на профи, а на новичков, просто потому что их больше.
ОтветитьУдалитьЯ не всегда отталкиваюсь с точки зрения бизнеса. Например, я развиваюсь не из-за экономических выгод в будущем, а потому что мне интересно, а экономическая выгода уже приходит позднее. С книгой тоже самое: для меня это не вопрос экономической выгоды, коей не будет вовсе, а вопрос приятного времяпрепровождения и собственного удовольствия от создания чего-то интересного.
УдалитьТак что в этом случае в качестве аудитории будет все же адвансд читатель, нежели новичок.
Издательство то отталкивается от бизнеса. Понятно что книга в любом случае будет не для новичка не в программировании, но относительно проектирования хотелось бы чтобы ваш опыт стал максимально доступен. Я сейчас читаю ваши статьи 2012 года и там много сложных терминов, не сточки зрения программирования, а именно для понимания их в отсутствии примеров.
УдалитьА можно пример по поводу непонятных терминов?
УдалитьПлюсую. Книгу бы непременно купил.
ОтветитьУдалить+1. Куплю обязательно. Желательно чтобы была также электронная версия
УдалитьРебята, всем огромное спасибо за отзывы. Я так понимаю, что вопрос актуальности снимается. Теперь нужно утрясти оставшиеся детали с издательством!
ОтветитьУдалитьБуду держать всех в курсе дела!
Сергей, пишите обязательно! Я очень надеюсь на всесторонний охват темы с учетом тонких моментов, мнений "за" и "против" (сколько копий сломано в святых войнах по поводу Singleton или Repository...), с максимально практическими выводами и материалом для размышлений. Другими словами, я за упор на хардкор. А для новичков отлично подойдет Head First Design Patterns.
ОтветитьУдалитьP.S. Только паттерны от GoF будете рассматривать? Ambient Context явно не оттуда :)
На самом деле Ambient Context описан в GoF, но его там никто не видит;)
УдалитьНо в основном упор будет на GoF и очень близкие к ним паттерны (или их разновидности).
Сергей,
ОтветитьУдалитьрад, что Ваш дао привел вас к мысли о создании книги! С удовольствием прочту и проголосую рублем.
Я за оба варианта - бумажный и электронный.
Антон, спасибо.
УдалитьДа, я думаю будет оба варианта.
Великолепный блог, думаю книга будет такая же, с удовольствием куплю и прочту.
ОтветитьУдалитьP.S. Спасибо за третьего Скита.
Сергей, спасибо.
УдалитьP.S. А вот по поводу Скита ждите отдельной заметки в Г+, нам не все так просто.
Первый в очереди на книгу... Когда примерно можно ждать?)
ОтветитьУдалитьОтличная новость! С удовольствием приобрету книгу!
ОтветитьУдалитьЗЫ: Если добавите еще паттерны для многопоточного программирования, цены книге не будет!
УдалитьАлександр, паттерны для многопоточного программирования - это отдельная и очень серьезная тема, так что в этот раз о них ничего не будет:(
УдалитьСергей, безусловно, написание книги по паттернам - это отличная идея, полностью в этом вас поддерживаю.
ОтветитьУдалитьМеня интересую один момент - на сколько книга будет привязана к платформе .NET? Дело в том, что мой основной язык программирования - Java, в связи с чем и возник вопрос выше. То есть можно написать книгу, где для примеров будет использоваться определенный язык программирования, но и при этом основные идеи от него не будут зависеть. А можно написать с использованием специальных возможностей языка, фреймворка и т.д.
Дмитрий, чтобы понять примерное содержимое книги достаточно глянуть на одну из статей по паттерном (можно начать с GoF паттерны на платформе .NET.
УдалитьВ целом, там есть несколько разделов: взгляд на классический паттерн в современных реалиях, его влияние на дизайн и .NET-специфик часть. Последнее играет достаточно важную роль, поскольку специфика может быть довольно существенной. В некотором случае можно легко найти аналоги из мира Java, а в некотором случае особенности будут исключительно платформенно-зависимыми.
Т.е. зависеть от языка повествование таки будет.
Ну наконец-то! Где подписать? Будем спрашивать на собеседованиях: Что читал? Рихтер, Тепляков, Фаулер?
ОтветитьУдалитьДенис, как будет у меня печатный экземпляр, вышлю тебе лично обязательно:))
Удалить+ 1 за книгу! Обязательно куплю, и даже прочитаю!
ОтветитьУдалитьЗаклинило мозг от размышлений, чем Ambient Context отличается от Singleton :) Я так понимаю, что синглтон - это один из способов реализации контекста?
Михаил, спасибо.
УдалитьЯ скоро возобновлю публикацию статей по паттернам, давайте сохраним интригу))))
Обязательно купил бы такую книгу. Читаю ваши статьи с удовольствием.
ОтветитьУдалитьХорошая идея. Правильная. Нужная.
ОтветитьУдалитьТолько можно мнение?
Тут по-моему уместно спрашивать - не "НУЖНА ли книга", а "КТО из ВАС её купит".
Ибо, программисты (простите уж) привыкли иметь ВСЁ И СРАЗУ и НАХАЛЯВУ, т.е. "купить конечно можно", но лучше - СКАЧАТЬ.
Стоит оно того? Не знаю. Я сам -- давно мучаюсь подобным вопросом.
Я скажу ЗА СЕБЯ - Я БЫ КУПИЛ.
Более того - я ЛИЧНО готов "помочь", ну там "советом" (хотя он вряд ли нужен) или "вычиткой" (хотя куда мне с моими Delphi казалось бы), а лучше - ФИНАНСОВО, а лично готов "влить" какое-то количество денег. Зачем? Ну чтобы сделать "мир программирования лучше" :-)
Я бы кстати на вашем месте организовал бы "подписку" - пусть КАЖДЫЙ желающий "занесёт" скромную сумму, ну например - "рубль" - и тогда сразу станет ясно - сколько потенциально людей "готовы купить".
Простите, если кого обидел.
P.S. а про подобную книгу, но "про Delphi" - сам давно думаю. Правда придерживаюсь мнения что "язык не важен". Для ЧИТАЮЩЕГО. Но не для ПИШУЩЕГО. Ибо пишущий он "силён конкретным опытом". А ЧИТАЮЩИЙ может "считать" и "опыт вообще".
Александр, спасибо!
УдалитьИдея и правда интересная (по поводу организации некоего фонда). Для меня, честно говоря, финансовый вопрос не сильно важен, но как дополнительный стимул (раз люди поддержали, значит нужно довести дело до конца), вполне ок.
И спасибо за желание по поводу вычитки, с удовольствием его приму!
З.Ы. Как только утрясем с издателем, я постучу ко всем, проявившим желание помочь с вычиткой;)
"Как только утрясем с издателем, я постучу ко всем, проявившим желание помочь с вычиткой"
Удалить-- да не вопрос. Всегда готов.
Я за! Давно хотел получить твой блог в распечатке )
ОтветитьУдалить+1! И ещё +1 за электронную версию.
ОтветитьУдалитьЭтот комментарий был удален автором.
ОтветитьУдалить+1 за книгу, особенно печатный вариант. Купил бы и советовал другим! Очень нравится ваш стиль изложения!
ОтветитьУдалитьОлег, спасибо!
УдалитьСергей, давно уже жду, когда же выйдет твоя книга! +1! Издательство "Питер" даже не знаю, чего думает. Надо издавать - однозначно. Жду экземпляр с автографом автора (шутка) :)
ОтветитьУдалитьБыло бы здорово.
ОтветитьУдалитьЧитать обязательно буду сам и коллегам посоветую.
ОтветитьУдалитьДерзайте!
Готов купить бумажный вариант книги хотя бы только из-за автора. Да и материал наверняка будет отличный.
ОтветитьУдалитьЕсли в течении года появится электронная версия - куплю обязательно.
ОтветитьУдалитьКуплю!
ОтветитьУдалитьОтличная идея, Сергей. Книгу куплю обязательно.
ОтветитьУдалитьНачал читать сейчас Вашу книгу.... :)
ОтветитьУдалитьСейчас на главе о Template method. Паттерн сам по себе довольо таки простой. Но не понятен вариант реализации в C# через делегаты... Я пишу на Java - там нет делегатов. Есть возможность привести пример на Java?
И чуть погуглил... Возник вопрос: Чем такой делегат отличается от DI? Я ж могу и реализацию подменить через set-метод...
На джаве без делегатов нужно использовать классическую версию с наследованием.
УдалитьЛибо ждать Java 8 (или 9), в которой появятся анонимные функции.
> Чем такой делегат отличается от DI? Я ж могу и реализацию подменить через set-метод...
Делегат вообще не отличается ничем от интерфейса с одним методом.
Время от времени возвращаюсь к разным главам книги. И сейчас решил выяснить все-таки один вопрос у автора (на 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);
}
}
Уместно ли в этом коде приведение типов? Нужно ли от него избавиться? И если да, то как это сделать правильней всего?
Виталий, здравствуй. Если ты дашь вопрос на SO, то я там продублирую ответ.
УдалитьИдея приведения типов в данном случае оправдана тем, что иерархия LogEntry представляет собой иерархию объектов-данных. При этом каждый тип наследника обладает дополнительными свойствами.
Это довольно популярный подход в функциональных языках программирования, таких как F#, в которых есть встроенная поддержка discriminated union и pattern matching-а. В C# 8, будет pattern matching на основе типов, что сделает этот код более красивым.
З.Ы. Есть ряд книг, которые пишут о том, что downcasting - это зло. Но там нужно понимать контекст. Даункастить объекты с поведением действительном может быть не очень, особенно, если это делается часто.
З.Ы.Ы. И еще: тут, по сути, происходит double dispatch, когда у нас есть две иерархии объектов - иерархия log entries, и иерархия LogSaver-ов. В этом случае, полностью избавиться от приведения типов довольно сложно.
Сергей, привет. Вот ссылка.
Удалитьhttps://softwareengineering.stackexchange.com/questions/351168/best-practice-to-avoid-or-refactor-casting-base-type-to-derived-class
Я там много комментариев оставил, но так и не добился понятного ответа.
Спасибо тебе большое за разъяснение и за книгу:)