Здравствуйте, Ночной Смотрящий, Вы писали:
ARK>>Паттерн-матчинг не является ни эквивалентом, ни заменой мультиметодов — он нерасширяем.
НС>Эквивалентом не является, он намного мощнее мультиметодов. Мультиметоды это просто частный, синтаксически громоздкий случай.
Мультиметод — это НЕ частный случай паттерн-матчинга. Паттерн-матчинг нерасширяем, а мультиметоды имеют открытую природу.
Здравствуйте, Воронков Василий, Вы писали: ВВ>То, что операторы с мульти-диспатчем — полезны, сомнений не вызывает, но можете ли вы привести примеры полезных функций, где требуется диспатч по >2 двум аргументам?
Когда-то писал интерпретатор формул. Там для бинарных операций (сложение, вычитание, ...) и разных типов аргументов (числа, даты, ...) делался трехмерный массив указателей на функции.
По сути, виртуальные функции от трех типов: тип бинарной операции, тип первого аргумента, тип второго аргумента.
Для тернарных операций был бы мульти-диспатч по четырем типам.
Только массив этот был сильно разреженный, большинство элементов были нулевыми указателями.
Например, умножение даты на число смысла не имеет и не задается указателя на соответствующую функцию.
Задание всего набора виртуальных функций для 2, 3-х и более мерного диспатча скорее всего будет избыточным и громоздким.
Гвоздями прибивается знание всех значений по всем измерениям.
Тут уже правильно вспомнили визитор. Удобная вещь для 2-мерного случая.
Знать надо только все типы посещаемых элементов, а множество типов визиторов — открытое.
Понятно, что в ряде случаев удобно, когда диспатч метода (в данном случае неважно — статически или динамически) происходит по типу нескольких аргументов(см. те же мультиметоды). Типичный пример удобства такого диспатча — математические операторы, где могут быть int + float и float + float. Последние, к слову, весьма неловко выражаются в чистом ООП, где диспатч происходит по типу первого аргумента.
А теперь, собственно, вопрос.
То, что операторы с мульти-диспатчем — полезны, сомнений не вызывает, но можете ли вы привести примеры полезных функций, где требуется диспатч по >2 двум аргументам?
Здравствуйте, qaz77, Вы писали:
Q>Тут уже правильно вспомнили визитор. Удобная вещь для 2-мерного случая.
Жутко неудобная, но в мейнстриме ничего удобнее все равно нет. Да и мультиметоды тоже громоздки. Нормальный паттерн матчинг гибче и удобнее на порядок.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>То, что операторы с мульти-диспатчем — полезны, сомнений не вызывает, но можете ли вы привести примеры полезных функций, где требуется диспатч по >2 двум аргументам?
Поскольку в мейнстримовых языках мультиметодов нет, то "всё кажется гвоздями", т.е. нормальных примеров что-то в голову не приходит. По идее, это должна быть некая операция в нескольких "измерениях".
Здравствуйте, Воронков Василий, Вы писали:
ВВ>То, что операторы с мульти-диспатчем — полезны, сомнений не вызывает, но можете ли вы привести примеры полезных функций, где требуется диспатч по >2 двум аргументам?
Паттерн визитор это реализация динамического диспатча по двум аргументам через динамический диспатч по одному аргументу. Соответственно везде, где он применяется.
Здравствуйте, vsb, Вы писали:
ВВ>>То, что операторы с мульти-диспатчем — полезны, сомнений не вызывает, но можете ли вы привести примеры полезных функций, где требуется диспатч по >2 двум аргументам?
vsb>Паттерн визитор это реализация динамического диспатча по двум аргументам через динамический диспатч по одному аргументу. Соответственно везде, где он применяется.
Здравствуйте, AlexRK, Вы писали:
ВВ>>>То, что операторы с мульти-диспатчем — полезны, сомнений не вызывает, но можете ли вы привести примеры полезных функций, где требуется диспатч по >2 двум аргументам?
vsb>>Паттерн визитор это реализация динамического диспатча по двум аргументам через динамический диспатч по одному аргументу. Соответственно везде, где он применяется.
ARK>Вопрос был про 3 аргумента и более.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>То, что операторы с мульти-диспатчем — полезны, сомнений не вызывает, но можете ли вы привести примеры полезных функций, где требуется диспатч по >2 двум аргументам?
А паттерн Сигнал-Слот подходит под ответ?
Имеется ввиду, следующее понимание паттерна Сигнал-Слот: у нас есть набор типов не знающие ничего друг о друге и некий конструкт, который диспетчеризирует сигналы с X-набором параметров одного типа в вызов(ы) методов другого типа с Y набором параметров.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Жутко неудобная, но в мейнстриме ничего удобнее все равно нет. Да и мультиметоды тоже громоздки. Нормальный паттерн матчинг гибче и удобнее на порядок.
Паттерн-матчинг не является ни эквивалентом, ни заменой мультиметодов — он нерасширяем.
Здравствуйте, AlexRK, Вы писали:
НС>>Жутко неудобная, но в мейнстриме ничего удобнее все равно нет. Да и мультиметоды тоже громоздки. Нормальный паттерн матчинг гибче и удобнее на порядок. ARK>Паттерн-матчинг не является ни эквивалентом, ни заменой мультиметодов — он нерасширяем.
Эквивалентом не является, он намного мощнее мультиметодов. Мультиметоды это просто частный, синтаксически громоздкий случай.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>То, что операторы с мульти-диспатчем — полезны, сомнений не вызывает, но можете ли вы привести примеры полезных функций, где требуется диспатч по >2 двум аргументам?
Примеров много, но большинство из них решается и паттер-матчингом по кортежам.
У мульти-методов есть проблемы с динамической расширяемостью и модульностью. В средах вроде дотнета или явы сборки/классы могут загружаться и даже выгружаться в рантайме. При этом должно меняться и поведение мультимедовов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.