Я регулярно программирую на R в профессиональном контексте, и я пишу пакеты для клиентов или коллег. Некоторые из программистов здесь имеют опыт работы с Java и настаивают на том, чтобы делать все объектно-ориентированным способом, используя методы S4. С другой стороны, мой опыт показывает, что реализации S4 часто работают хуже и вызывают гораздо больше головной боли при попытке заставить код делать то, что вы от него хотите.
Я определенно согласен с тем, что в некоторых случаях вы должны иметь возможность создавать сложные объекты или добавлять существующие объекты контролируемым образом. Но большую часть времени, Реализации S4 могут быть легко выполнены с использованием классических списков, без каких-либо хлопот, таких как определение standardGeneric, методов, конструкторов, инициализаторов и т. П.
Когда вы планируете писать реализации S4 для R?
РЕДАКТИРОВАТЬ: Для ясности, Я действительно ценю ответы и обсуждение ОО в целом в R. ООП может быть проведено множеством способов в R, но мой вопрос действительно нацелен на дополнительную ценность использования методов S4 конкретно.
Я предполагаю, что это не относится к вам напрямую, но если вы разрабатываете пакеты для Bioconductor, у вас есть стимул использовать S4, поскольку они активно поощряют его использование и в лучшую сторону уже десять лет, поэтому все основные пакеты активно используют S4.
Я считаю, что все дополнительные накладные расходы - это боль - setGeneric, setMethod, работа с NAMESPACE и т. д. При этом я считаю, что структура, которую они навязывают, потенциал расширяемости и другие подобные вещи могут того стоить. . Как и во всем, здесь есть компромиссы. Я думаю, что это может быть намного чище - мне не нравится, как методы S3 просто замаскированы соглашением об именах (foo.class). При всем при этом я стараюсь избегать интенсивного использования S4 в своем собственном коде, если мне не говорят об этом.
Мой опыт совпадает с вашим, поэтому я использую исключительно S3.
Для уточнения: в S4 есть несколько удобных функций (например, диспетчеризация нескольких аргументов и проверка типов слотов), но я не сталкивался с ситуацией, когда функции перевешивали затраты. Примеры затрат включают: любое изменение слота требует полной копии объекта и (что может быть хуже) текущих изменений в методах S4.
Короче говоря, мне нравится идея S4, но я подожду, пока она созреет, прежде чем использовать ее в своем собственном коде.
Отличный вопрос! и я надеюсь, что это вызовет вдумчивое обсуждение...
Я никогда не использовал его и не собираюсь использовать по следующим причинам:
Я люблю сахар, что тут скажешь!