Категории Objective C == шаблон "посетитель"?

Существуют некоторые реальные проблемы с выравниванием аргумента и API драйвера. Проверьте бету CUDA 2.2 (или позже) документация для получения дополнительной информации.

6
задан Dave Schweisguth 14 February 2016 в 00:07
поделиться

1 ответ

Нет, категории Objective-C не являются реализацией шаблона посетителя. Категории действительно не имеют точного соответствия в мире шаблонов проектирования, так как техника внедрения методов в существующие классы без подклассов невозможна на большинстве языков. Я бы сказал, что он ближе к шаблону декоратора , но этот шаблон обычно реализуется с помощью композиции, то есть путем обертывания экземпляра объекта, который вы хотите «улучшить».

Шаблон посетителя полезен для логика алгоритма инкапсуляции, которая может применяться к различным объектам, структурам и т. д. Например, если вы хотите создать вывод HTML для графа объектов, вы можете (A) написать метод htmlString для каждого объект и вызвать его для каждого объекта, или (B) используйте шаблон посетителя и создайте конкретного посетителя, который знает, как производить вывод HTML для каждого посещаемого узла.

Первый подход является более общим, и логика для задачи T разбросана небольшими порциями по классам X , Y и Z. Последний подход помещает весь связанный код в один объект-посетитель, что упрощает обслуживание и предотвращает проблему «Я забыл, что один класс ...». Однако шаблон посетителя, возможно, несколько неуклюжий для простых ситуаций - когда он действительно окупается, когда у вас есть несколько различных параллельных функций и вы хотите абстрагироваться от логики классов, в которых эти функции выполняются. Например, вы можете внедрить других посетителей, которые производят вывод в формате PDF или RTF и т. Д. Каждый посетитель может позаботиться о рекурсии и вызвать свои собственные методы посещения в необходимом порядке, а отдельные посетители могут использовать совершенно другой порядок.

Следует отметить, что на многих языках шаблон посетителя использует перегрузку методов (то же имя, другая подпись / аргументы). Поскольку Objective-C не допускает перегрузки методов, вы должны использовать разные имена методов, но это действительно может помочь избежать ошибок, вызванных незнанием того, какая перегрузка вызывается.

12
ответ дан 8 December 2019 в 17:24
поделиться