Что я могу использовать вместо интерфейсов в Ruby (или любом другом динамическом языке)?

9

Моя цель - определить контракты между классами.

Мне нравится Duck Typing и все, но я также хотел бы определить интерфейс между различными уровнями моего приложения, чтобы четко определить, какой метод вызывать из внешнего интерфейса, а какие - вспомогательные методы, которые не должны использоваться другим уровнем. ,

Например, в Java я могу определить интерфейс Persistor с помощью методов, таких как get () и save (), а затем определить класс JdbcPersistor со всеми методами, которые мне нужны для сохранения в базе данных. И, может быть, другой RestPersistor с другими методами для сохранения на удаленном restserver.

Я не прошу интерфейсы в Ruby, просто чтобы узнать, есть ли аккуратный способ сохранить это различие. Мне нравится Ruby, но я работал только над небольшими проектами.

Uberto
источник
Я думаю, что это принадлежит StackOverflow ...
Торстен Мюллер
2
Переполнение стека @thorsten предназначено для конкретных проблем реализации (т. е. есть проблема в коде). Общие вопросы разработки программы обсуждаются здесь на Programmers.SE.
@Mark: спасибо за исправление. Я подумал, что это слишком конкретно для Руби (и пропустил последнее предложение Уберто). Поэтому я обновил свои знания часто задаваемых вопросов. (Все еще находя здесь дорогу)
Торстен Мюллер
+1 Отличный вопрос. Мне интересно, есть ли другой способ, кроме как писать, читать и обновлять тонны документации или использовать некоторые глупые соглашения, такие как предшествующие внутренние вспомогательные методы с подчеркиванием или что-то в этом роде.
Joonas Pulakka
+1 Кстати, PLT Racket имеет поддержку контрактов и является динамичным. Добавление чего-то похожего на Ruby было бы интересным проектом.
Ларри Коулман

Ответы:

5

Ответ на этот вопрос был дан в контексте интерфейсов C # и Ruby on stackoverflow: /programming/3505521/in-ruby-what-is-the-equivalent-to-an-interface-in-c .

Подводя итог: нет точного эквивалента в Ruby, так как типизация утки делает ненужным формальный интерфейс. Вместо этого рассмотрите возможность тестирования на соответствие «интерфейсу» или использованию контракта respond_to?.

Корбин Март
источник
2
да, но это не мешает коду обращаться к методу, который не должен
Uberto
2

Некоторые динамически типизированные языки имеют интерфейсы или похожую концепцию. Например, Objective-C имеет протоколы. Но большинство этого не делают. Чтобы быть эффективным в динамическом языке, вы должны забыть то, что знаете о статически типизированных языках, принять динамическую природу языка. Динамически типизированные языки обычно избегают использования интерфейсов.

mipadi
источник
1

В Perl 5 и Moose, и Moo предоставляют роли (или черты), которые могут потребовать реализации определенных методов. Moose также поставляется с системой типов времени выполнения, которая позволяет вам определять duck_typeтип, который объявляет объекты, имеющие необходимый набор методов.

Роли реализуются самими классами (или другими ролями), а также обеспечивают реализацию и поведение, а не только интерфейс. Но они также (по крайней мере, в Moose) обрабатывают такие вещи, как обнаружение конфликтов методов.

phaylon
источник