Спасибо :). У нас 1.11 стартует новый поток по GRASP & GOF DESIGN PATTERNS. В пакете Platinum есть проверка заданий, участие в онлайн вебинарах с Сергеем и перезаписанные в качестве лекции.
Очень полезно про factory method. Сколько я читал в интернете про factory method до меня ни как не доходило зачем для создания каждой реализации интерфейса создавать отдельный класс создатель, оказалось просто незачем, и лучше пользоватся simple factory.
По поводу плюсового примера абстрактной фабрики: таки студент был (почти) прав насчёт "не скомпилится" :) Если быть более точным: скомпилится, но не слинкуется. Эксепшны C++ в таких случаях не бросает -- до них дело не доходит :) Плюсы подобные ошибки определяют не в рантайме, а на этапе компиляции и сборки. Вызов предварительно объявленного, но не реализованного метода, -- это ошибка линкера. Но это всё придирки. Для объяснения данного паттерна совершенно неважно, как конкретно этот статический метод реализован, всё и без него было предельно понятно.
Неверно объясняет фабричный метод. В GoF подразумевалось, что когда внутри некоторого класса требуется использовать объект другого класса и при этом мы не хотим завязываться на конкретную реализацию, то можно создать фабричный метод, а сам класс сделать абстрактным. Таким образом получается что вся логика находится в абстрактном классе, а наследники абстрактного класса реализуя фабричный метод могут подменять объект, который используется в родительском классе. Шаблон позволяет переложить выбор конкретного объекта на классы наследники, а не принимать это решение на этапе проектирования родительского класса. Этот шаблон лучше объяснять после шаблона Template method, потому что они похожи и я думаю что в головах авторов template method и являлся прародителем фабричного метода. То что автор объяснил это не фабричный метод, это процедурная лапша на свитчах.
Мне с трудом удалось разобрать ваш текст, но, кажется, что именно это лекция и подразумевала. По поводу свитчей - в GoF есть подобная реализация, и, по моему, вам не стоило бы говорить, что они подразумевали, когда писали книгу, потому что это ваще субьективное мнение. Но есть реальность, где в книге есть пример с процедурной лапшой на свитчах (на ифах): class Creator { public: virtual Product* Create(ProductId); }; Product* Creator::Create (ProductId id) { if (id == MINE) return new MyProduct; if (id == YOURS) return new YourProduct; // repeat for remaining products... return 0; } Паттерны не имеют цели убрать ифы или свитчи, там все про композицию и правильное взаимодействие между обьектами, что само по себе делает количество ифов меньшим, а саму програму понятной, легко расшираемой и гибкой.
23:23. "Почему не скомпилируется? это скомпилируется. Это С++. Просто при попытке вызова вот здесь будет exception" - .. эммм.... да, скомпилируется, но не слинкуется. так что exception там не будет. exception - это run-time, а запускать будет нечего, ибо раз не слинкуется, то не будет бинарника. Вот именно что это с++. В остальном - спасибо, красиво и точно изложено.
Здравствуйте, Сергей! Есть ли оптимальный способ реализации factory method при постоянно растущей иерархии наследников? Нормально ли, постоянно увеличивающееся количество if в фабричном методе ? Заранее спасибо!
А чем Абстрактная фабрика отличается от Стратегии? В стратегии ведь также объявляется интерфейс и в него подставляются нужные реализации. Здесь тоже есть абстрактный класс файбрики, в которую подставляются конкретные реализации ВинФабрики и МакФабрики.
такие лекции не так читаются. на этом уровне чувакам надо давать на уровне проблема-решение. и так до тех пор, пока не наберем некий пулл. причем некоторые типовые проблемы имеют несколько решений. везде есть плюсы и минусы. потом, когда аудитория сможет предлагать решения предлагаемым шаблонам, можно усложнять задачи, заставляя аудиторию разлагать сложные проблемы на совокупность типовых паттернов. ну, за одну лекцию, конечно, это хрен расскажешь... это тема, скорее, для спецкурса
Не очень то мне нравится что то factory method... Выходит что базовый класс обязан знать всех своих наследников. Как то не очень удобно. Добавляя новый класс, прийдется дописывать базовый, что не айс. :) А так, очень даже интересно :)
я думаю что ф.м. чаще всего немного по-другому используется. смысл не в том, чтобы иметь возможность вернуть любого наследника, а в том, чтобы вернуть актуального наследника. По крайней мере в стандартных библиотека джавы это так. В том же примере с jdbc Connection - мы же не выбираем тип конекшна.
1:52 случайно включил титры: "...так что видели сразу низкой где этом книжка порно львов -- википедия спасет всех" :-) так дальше еще веселее -- микрофончик бы Вам.
Если классы наследуются не для полиморфизма, а для наследования общей логики, и вдруг в клиенте нужен геттер именно конкретного класса, то приходится использовать приведение типа к конкретному классу. Вся логика рушится, клиент зависит еще и от наследника. Как развязать? Ставить всем наследникам геттер с заглушками, проверять потом NULL или смириться с приведением?
Сергей, спасибо. Но остался самый важный для меня вопрос. Это точно не попытка уколоть, а желание разобраться в происходящем. Поэтому прошу не обижаться и ответить на него: Почему вы в лекции употребляете жаргоны и иностранные слова вместо наиболее точных и широко понятных русских слов? Дело в том, что таким образом вы закладываете использование таких слов в среде Ваших учеников. Очевидно, это способствует Вашей популярности и авторитету в среде обучающейся молодёжи, притоку учеников. Но это мешает пониманию значения и сути употребляемых слов. А как следствие приводит к абстрактному значению высказываемых ими предложений, сложности ясно понять и однозначно описать задачу. И как результат появляются проблемы взаимодействия при построении большой сложной системы так обученными программистами. А это уменьшает вероятность успешной автоматизации и создания надёжной удобной системы.
Пример употребления? Я вижу, что наоборот, английский язык поможет потом лучше понимать и осваивать информацию с иностранных источников, взаимодействовать с зарубежными программистами для решения каких-либо вопросов. От ваших слов исходит запах дешевого патриотизма
@@Алекс-ы4с2п Рад за остроту Вашего зрения и обоняния. Английский язык действительно поможет во многих случаях. Но лекция на русском языке. И употребление в ней, например, слова паттерны, вносит путаницу сразу с 2 словами: шаблоны и patterns. Это добавляет лишней работы головному мозгу для поиска наиболее подходящего слова для понимания смысла, отсекание связей с менее подходящими словами. Кроме того запоминание слова "паттерны" вместо patterns вряд ли поможет взаимодействовать с зарубежными заказчиками или программистами. Проясните, пожалуйста, "пример употребления" кем и чего Вы меня спрашиваете?
В ожидании ответа мои мозги не перестали работать и нашли свой: Я думаю, что причина в плохом переводе с иностранного языка. Затрудняясь подобрать наиболее подходящее слово переводчик делает заимствование иностранного слова. Читатель также не может ясно понять смысл этого слова, но боится показать своё незнание. Поэтому додумывает смысл сам как получится. И использует именно это слово, чтобы не ошибиться в переводе. Заимствование постепенно становится известным словом и даже стандартом в узком кругу.. Похоже на действительность? :)
Лектор не знаєт что такое абстрактная фабрика, одним словом больше теоретик чем практик, уверен что если ему дать написать код то он не сделает Абстрактную фабрику без подказок с интернет.
На данный момент, это лучшее что есть на ютубе про патерны, Сергей, респект
Спасибо :). У нас 1.11 стартует новый поток по GRASP & GOF DESIGN PATTERNS. В пакете Platinum есть проверка заданий, участие в онлайн вебинарах с Сергеем и перезаписанные в качестве лекции.
Очень полезно про factory method. Сколько я читал в интернете про factory method до меня ни как не доходило зачем для создания каждой реализации интерфейса создавать отдельный класс создатель, оказалось просто незачем, и лучше пользоватся simple factory.
0:33 - О шаблонах GoF
1:59 - Типы шаблонов
5:13 - Абстрактная фабрика
26:53 - Абстрактная фабрика. Критика
30:20 - Фабричный метод
спасибо)
Сильно объяснили, особенно по теме Factory Method. Спасибо большое.
По поводу плюсового примера абстрактной фабрики: таки студент был (почти) прав насчёт "не скомпилится" :) Если быть более точным: скомпилится, но не слинкуется. Эксепшны C++ в таких случаях не бросает -- до них дело не доходит :) Плюсы подобные ошибки определяют не в рантайме, а на этапе компиляции и сборки. Вызов предварительно объявленного, но не реализованного метода, -- это ошибка линкера.
Но это всё придирки. Для объяснения данного паттерна совершенно неважно, как конкретно этот статический метод реализован, всё и без него было предельно понятно.
Неверно объясняет фабричный метод. В GoF подразумевалось, что когда внутри некоторого класса требуется использовать объект другого класса и при этом мы не хотим завязываться на конкретную реализацию, то можно создать фабричный метод, а сам класс сделать абстрактным. Таким образом получается что вся логика находится в абстрактном классе, а наследники абстрактного класса реализуя фабричный метод могут подменять объект, который используется в родительском классе. Шаблон позволяет переложить выбор конкретного объекта на классы наследники, а не принимать это решение на этапе проектирования родительского класса. Этот шаблон лучше объяснять после шаблона Template method, потому что они похожи и я думаю что в головах авторов template method и являлся прародителем фабричного метода. То что автор объяснил это не фабричный метод, это процедурная лапша на свитчах.
Мне с трудом удалось разобрать ваш текст, но, кажется, что именно это лекция и подразумевала. По поводу свитчей - в GoF есть подобная реализация, и, по моему, вам не стоило бы говорить, что они подразумевали, когда писали книгу, потому что это ваще субьективное мнение. Но есть реальность, где в книге есть пример с процедурной лапшой на свитчах (на ифах):
class Creator {
public:
virtual Product* Create(ProductId);
};
Product* Creator::Create (ProductId id) {
if (id == MINE) return new MyProduct;
if (id == YOURS) return new YourProduct;
// repeat for remaining products...
return 0;
}
Паттерны не имеют цели убрать ифы или свитчи, там все про композицию и правильное взаимодействие между обьектами, что само по себе делает количество ифов меньшим, а саму програму понятной, легко расшираемой и гибкой.
23:23. "Почему не скомпилируется? это скомпилируется. Это С++. Просто при попытке вызова вот здесь будет exception" - .. эммм.... да, скомпилируется, но не слинкуется. так что exception там не будет. exception - это run-time, а запускать будет нечего, ибо раз не слинкуется, то не будет бинарника. Вот именно что это с++. В остальном - спасибо, красиво и точно изложено.
Спасибо, очень подробно и понятно!
Thanks so much for this video tutorial.
О блин, капец. В это время он ещё не был Сергеем Немчинским
Здравствуйте, Сергей!
Есть ли оптимальный способ реализации factory method при постоянно растущей иерархии наследников? Нормально ли, постоянно увеличивающееся количество if в фабричном методе ?
Заранее спасибо!
А чем Абстрактная фабрика отличается от Стратегии? В стратегии ведь также объявляется интерфейс и в него подставляются нужные реализации. Здесь тоже есть абстрактный класс файбрики, в которую подставляются конкретные реализации ВинФабрики и МакФабрики.
такие лекции не так читаются. на этом уровне чувакам надо давать на уровне проблема-решение. и так до тех пор, пока не наберем некий пулл. причем некоторые типовые проблемы имеют несколько решений. везде есть плюсы и минусы.
потом, когда аудитория сможет предлагать решения предлагаемым шаблонам, можно усложнять задачи, заставляя аудиторию разлагать сложные проблемы на совокупность типовых паттернов.
ну, за одну лекцию, конечно, это хрен расскажешь... это тема, скорее, для спецкурса
Не очень то мне нравится что то factory method...
Выходит что базовый класс обязан знать всех своих наследников. Как то не очень удобно. Добавляя новый класс, прийдется дописывать базовый, что не айс. :)
А так, очень даже интересно :)
я думаю что ф.м. чаще всего немного по-другому используется. смысл не в том, чтобы иметь возможность вернуть любого наследника, а в том, чтобы вернуть актуального наследника. По крайней мере в стандартных библиотека джавы это так. В том же примере с jdbc Connection - мы же не выбираем тип конекшна.
1:52 случайно включил титры:
"...так что видели сразу низкой где этом книжка порно львов -- википедия спасет всех"
:-) так дальше еще веселее -- микрофончик бы Вам.
Если классы наследуются не для полиморфизма, а для наследования общей логики, и вдруг в клиенте нужен геттер именно конкретного класса, то приходится использовать приведение типа к конкретному классу. Вся логика рушится, клиент зависит еще и от наследника. Как развязать? Ставить всем наследникам геттер с заглушками, проверять потом NULL или смириться с приведением?
геттер вообще не очень хорошее решение. Попробуйте использовать принцип Tell, dont ask
@@SergeyNemchinskiy Спасибо!
Плохо, что билдера пропустили...
Сергей, спасибо. Но остался самый важный для меня вопрос. Это точно не попытка уколоть, а желание разобраться в происходящем. Поэтому прошу не обижаться и ответить на него: Почему вы в лекции употребляете жаргоны и иностранные слова вместо наиболее точных и широко понятных русских слов?
Дело в том, что таким образом вы закладываете использование таких слов в среде Ваших учеников. Очевидно, это способствует Вашей популярности и авторитету в среде обучающейся молодёжи, притоку учеников. Но это мешает пониманию значения и сути употребляемых слов. А как следствие приводит к абстрактному значению высказываемых ими предложений, сложности ясно понять и однозначно описать задачу. И как результат появляются проблемы взаимодействия при построении большой сложной системы так обученными программистами. А это уменьшает вероятность успешной автоматизации и создания надёжной удобной системы.
Пример употребления?
Я вижу, что наоборот, английский язык поможет потом лучше понимать и осваивать информацию с иностранных источников, взаимодействовать с зарубежными программистами для решения каких-либо вопросов. От ваших слов исходит запах дешевого патриотизма
@@Алекс-ы4с2п Рад за остроту Вашего зрения и обоняния.
Английский язык действительно поможет во многих случаях. Но
лекция на русском языке. И употребление в ней, например, слова паттерны, вносит путаницу сразу с 2 словами: шаблоны и patterns. Это добавляет лишней работы головному мозгу для поиска наиболее подходящего слова для понимания смысла, отсекание связей с менее подходящими словами.
Кроме того запоминание слова "паттерны" вместо patterns вряд ли поможет взаимодействовать с зарубежными заказчиками или программистами.
Проясните, пожалуйста, "пример употребления" кем и чего Вы меня спрашиваете?
В ожидании ответа мои мозги не перестали работать и нашли свой:
Я думаю, что причина в плохом переводе с иностранного языка.
Затрудняясь подобрать наиболее подходящее слово переводчик делает заимствование иностранного слова. Читатель также не может ясно понять смысл этого слова, но боится показать своё незнание. Поэтому додумывает смысл сам как получится. И использует именно это слово, чтобы не ошибиться в переводе. Заимствование постепенно становится известным словом и даже стандартом в узком кругу..
Похоже на действительность? :)
В С++ методы называют функциями-член
Лектор не знаєт что такое абстрактная фабрика, одним словом больше теоретик чем практик, уверен что если ему дать написать код то он не сделает Абстрактную фабрику без подказок с интернет.
с чего ты это взял?
777