паттерны программирования
Jul. 5th, 2022 03:53 pmГлавная боль с ними - это отсутствие нормальной документации.
Я только что хотел показать человеку "adapter". Казалось бы, пять строчек. Всё, что я нашёл - это какая-то бездна, и мой мозг стекает ещё до того, как я заканчиваю читать. Я понимаю паттерн, я не понимаю, что эти авторы хотят сказать.
Или, фабрика. Тривиальная же вещь: верни функцию с замыканием вместо значения. Но нет, всё, что идёт в статьях со словом "pattern", кажется, написано людьми, которые *любят* xml, писают кипятком от синтаксиса java и хочень бы хотели xlst вот ту вот очаровательную soap.
... Отсюда, вопрос, а есть ли кто-то, кто этим вопросом занимался и кто бы написал вменяемый обзор? Я понимаю, что у разных языков программирования разный уровень бойлерплейта (builder pattern для Rust/Java - это база и так и надо, в питоне можно, но будет выглядеть странно, потому что в аргументах можно много и выразительно варьироваться), но всё-таки, самый базовый простой обзор? Желательно, без махрового ООП.
Я только что хотел показать человеку "adapter". Казалось бы, пять строчек. Всё, что я нашёл - это какая-то бездна, и мой мозг стекает ещё до того, как я заканчиваю читать. Я понимаю паттерн, я не понимаю, что эти авторы хотят сказать.
Или, фабрика. Тривиальная же вещь: верни функцию с замыканием вместо значения. Но нет, всё, что идёт в статьях со словом "pattern", кажется, написано людьми, которые *любят* xml, писают кипятком от синтаксиса java и хочень бы хотели xlst вот ту вот очаровательную soap.
... Отсюда, вопрос, а есть ли кто-то, кто этим вопросом занимался и кто бы написал вменяемый обзор? Я понимаю, что у разных языков программирования разный уровень бойлерплейта (builder pattern для Rust/Java - это база и так и надо, в питоне можно, но будет выглядеть странно, потому что в аргументах можно много и выразительно варьироваться), но всё-таки, самый базовый простой обзор? Желательно, без махрового ООП.
no subject
Date: 2022-07-06 08:49 am (UTC)!markdown Вот пример типовой фабрики из питона:
Где здесь классы? (можно даже декоратор пропустить - просто
return inner_eval- вот тебе и фабрика). Для меня вот эта взаимосвязь "родительский класс и подкласс" совершенно не очевидна.Фабрика производит любые новые объекты. Это могут быть функции, модули, даже package'и. Могут быть инстансы класса, могут быть классы.
Изначальную книжку, кстати, надо прочитать, хотя я подозреваю, что оно всё будет утыкано "родительскими классами" и прочими оопными фигнями.
no subject
Date: 2022-07-07 12:08 am (UTC)Классическая фабрика - именно виртуальный конструктор.
no subject
Date: 2022-07-07 09:17 am (UTC)Для меня это новость, например. Сколько я работал - фабрика, это то, что возвращает callable. Точнее, "фабрика", это паттерн, в котором нам надо сделать "значение с параметром", и для "значения с параметром" мы возвращаем callable, в котороый это значение уже и передаётся.
Возможно, это эффект питоновой пофигистичности в вопросах обязательности классов, но мне кажется, что для объяснения сути происходящего классовость как раз второстепенна.
Кстати, функция может возвращать класс. Я так даже иногда делаю.
(или return Resut(), не важно)
Очень удобно потом делать foo().foo или foo().bar
Интересно, это всё-таки уже фабрика или нет?
no subject
Date: 2022-07-07 04:44 pm (UTC)Но это непростые примеры. Для них функции и классы должны быть нетривиальными, поддерживающими объектный интерфейс. Чтобы посмотреть, как выглядит внутри функция-как-объект, посмотрите на функторы в C++. Вкратце, их интерфейс заключается в наличии перегруженного оператора () с некоей ожидаемой сигнатурой (как это нынче называется по-русски?). Точно так же, класс-как-объект можно описать как имеющий интерфейс в виде функции (или нескольких функций с разными аргументами), которая конструирует объекты - угу, виртуальный конструктор. То есть, этот класс является по сути фабрикой (ну да, фабрика в фабрике). Ну, плюс можно конечно добавить некие "статические методы", но потребность в фабрикации классов - не в них, а в "фабрике в фабрике".
Все это гораздо сложнее и запутаннее для объяснения, чем классический вариант. И понимание этих сложных вариантов требует сначала понимания простого классического варианта (что, наверное, эта дискуссия тоже демонстрирует).
Возврат callable - это вообще ситуация, где можно легко обойтись без фабрик. Можно просто вместо фабрики передавать функцию, которая будет каждый раз вызываться с полным набором параметров. Фабрика тут дает оптимизацию, когда некое повторно используемое подмножество параметров можно пред-обработать один раз и потом запомнить в обработанном виде для последующих вызовов.