amarao: (Default)
[personal profile] amarao
Главная боль с ними - это отсутствие нормальной документации.

Я только что хотел показать человеку "adapter". Казалось бы, пять строчек. Всё, что я нашёл - это какая-то бездна, и мой мозг стекает ещё до того, как я заканчиваю читать. Я понимаю паттерн, я не понимаю, что эти авторы хотят сказать.

Или, фабрика. Тривиальная же вещь: верни функцию с замыканием вместо значения. Но нет, всё, что идёт в статьях со словом "pattern", кажется, написано людьми, которые *любят* xml, писают кипятком от синтаксиса java и хочень бы хотели xlst вот ту вот очаровательную soap.

... Отсюда, вопрос, а есть ли кто-то, кто этим вопросом занимался и кто бы написал вменяемый обзор? Я понимаю, что у разных языков программирования разный уровень бойлерплейта (builder pattern для Rust/Java - это база и так и надо, в питоне можно, но будет выглядеть странно, потому что в аргументах можно много и выразительно варьироваться), но всё-таки, самый базовый простой обзор? Желательно, без махрового ООП.

Date: 2022-07-05 02:11 pm (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

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

Date: 2022-07-05 03:03 pm (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Фабрика производит инстансы конкретного типа, а абстрактная параметризуется типом. Верно насчет классов. Но не редактировать же эту древнюю хрень.

Date: 2022-07-05 03:43 pm (UTC)
sab123: (Default)
From: [personal profile] sab123
Фабрику проще всего понимать как виртуальный конструктор - она производит объекты с типом некоего родительского класса, которые являются на самом деле объектом некоего подкласса.

Ну и вообще, по уму не люди для паттернов, а паттерны для людей. Не нужно писать программы "вот тут мы поставим такой паттерн, там - эдакий паттерн". Нужно писать программы "тут мы сделаем вот так, потому что оно следует из логики нужного - о, да это же получается паттерн Х, значит надо обратить внимание на то и это, типичное для такого паттерна".

Что не так с изначальной книжкой? (Ну, кроме того, что она не объясняет "паттерны для людей").

Date: 2022-07-06 08:47 am (UTC)
From: [personal profile] ex0_planet
Достаточно легко гуглится: тема беспокоит многих и срачей всех уровней в интернете предостаточно.

Вот например:
http://www.cs.ox.ac.uk/publications/publication1452-abstract.html

Date: 2022-07-06 09:24 am (UTC)
From: [personal profile] ex0_planet
Ну, тут два момента.

Первый — это то, что GoF'овские крокозяблы продиктованы структурой языка (Java/C++) в значительной степени; сами паттерны (как типовые проблемы и типовые решения) от этого никуда не деваются и статья по ссылке как раз показывает как их выразить проще, вплоть до тривиальности.

Второй — Банда действительно много чего интересного обошла вниманием, но этого по-моему в связном виде очень и очень мало.

PS. И вдогонку:

The need for patterns results from using computer languages or techniques with insufficient abstraction ability. Under ideal factoring, a concept should not be copied, but merely referenced. But if something is referenced instead of copied, then there is no "pattern" to label and catalog.

Отсюда: https://sourcemaking.com/design_patterns/

Выделенное по-моему вполне объясняет почему "паттернами" никто не занимается за пределами OOA/OOD тусовки — за отсутствием предмета занятий.
Edited Date: 2022-07-06 10:14 am (UTC)

Date: 2022-07-06 11:42 am (UTC)
juan_gandhi: (Default)
From: [personal profile] juan_gandhi

Нет, проще. Возвращаемая имплементация запрашиваемого интерфейса зависит от рантайм-факторов.

Date: 2022-07-06 12:27 pm (UTC)
From: [personal profile] ex0_planet
Идеального факторинга добиться невозможно, да скорее всего и не нужно. Поэтому да, какие-то концепции будут влезать с трудом, какие-то проще.

> приложению не передали имя файла как аргумент, надо читать с stdin.
Как фича application framework'а например.

> разделять приложение foo на libfoo и само foo, которое использует libfoo.
Как фича системы сборки, которая определяет, например, собираемся ли мы под условный дебиан и включает это разделение. Вопрос лишь в том, нужны ли нам настолько умные фреймворки.

Date: 2022-07-06 01:10 pm (UTC)
From: [personal profile] ex0_planet
Мы о разных паттернах по ходу. Паттерны в GoF смысле это таки артефакты "не такого" факторинга, а ты говоришь о _принципах_. Вот gigo — это типичный принцип, некая эвристика о которой мало что можно сказать, кроме констатации её существования.

Date: 2022-07-07 12:08 am (UTC)
sab123: (Default)
From: [personal profile] sab123
Это странная фабрика, в расширенном толковании этого понятия, и с ипользованием функциональных подходов. Она производит функции. Которые, конечно, можно при желании тоже рассматривать как объекты, но можно и без этого обойтись.

Классическая фабрика - именно виртуальный конструктор.

Date: 2022-07-07 04:44 pm (UTC)
sab123: (Default)
From: [personal profile] sab123
Ну так в расширенном толковании все, что возвращает некие объекты, которые поддерживают определенный интерфейс, но внутри неким образом преконфигурированные - фабрика. Если функции - объекты, то то, что их создает - фабрика. Если классы - тоже объекты, то то, что их создает - фабрика.

Но это непростые примеры. Для них функции и классы должны быть нетривиальными, поддерживающими объектный интерфейс. Чтобы посмотреть, как выглядит внутри функция-как-объект, посмотрите на функторы в C++. Вкратце, их интерфейс заключается в наличии перегруженного оператора () с некоей ожидаемой сигнатурой (как это нынче называется по-русски?). Точно так же, класс-как-объект можно описать как имеющий интерфейс в виде функции (или нескольких функций с разными аргументами), которая конструирует объекты - угу, виртуальный конструктор. То есть, этот класс является по сути фабрикой (ну да, фабрика в фабрике). Ну, плюс можно конечно добавить некие "статические методы", но потребность в фабрикации классов - не в них, а в "фабрике в фабрике".

Все это гораздо сложнее и запутаннее для объяснения, чем классический вариант. И понимание этих сложных вариантов требует сначала понимания простого классического варианта (что, наверное, эта дискуссия тоже демонстрирует).

Возврат callable - это вообще ситуация, где можно легко обойтись без фабрик. Можно просто вместо фабрики передавать функцию, которая будет каждый раз вызываться с полным набором параметров. Фабрика тут дает оптимизацию, когда некое повторно используемое подмножество параметров можно пред-обработать один раз и потом запомнить в обработанном виде для последующих вызовов.

Profile

amarao: (Default)
amarao

February 2026

S M T W T F S
123456 7
8910111213 14
15161718192021
22232425262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 25th, 2026 01:12 pm
Powered by Dreamwidth Studios