Моя цель - определить контракты между классами.
Мне нравится Duck Typing и все, но я также хотел бы определить интерфейс между различными уровнями моего приложения, чтобы четко определить, какой метод вызывать из внешнего интерфейса, а какие - вспомогательные методы, которые не должны использоваться другим уровнем. ,
Например, в Java я могу определить интерфейс Persistor с помощью методов, таких как get () и save (), а затем определить класс JdbcPersistor со всеми методами, которые мне нужны для сохранения в базе данных. И, может быть, другой RestPersistor с другими методами для сохранения на удаленном restserver.
Я не прошу интерфейсы в Ruby, просто чтобы узнать, есть ли аккуратный способ сохранить это различие. Мне нравится Ruby, но я работал только над небольшими проектами.
источник
Ответы:
Ответ на этот вопрос был дан в контексте интерфейсов C # и Ruby on stackoverflow: /programming/3505521/in-ruby-what-is-the-equivalent-to-an-interface-in-c .
Подводя итог: нет точного эквивалента в Ruby, так как типизация утки делает ненужным формальный интерфейс. Вместо этого рассмотрите возможность тестирования на соответствие «интерфейсу» или использованию контракта
respond_to?
.источник
Некоторые динамически типизированные языки имеют интерфейсы или похожую концепцию. Например, Objective-C имеет протоколы. Но большинство этого не делают. Чтобы быть эффективным в динамическом языке, вы должны забыть то, что знаете о статически типизированных языках, принять динамическую природу языка. Динамически типизированные языки обычно избегают использования интерфейсов.
источник
В Perl 5 и Moose, и Moo предоставляют роли (или черты), которые могут потребовать реализации определенных методов. Moose также поставляется с системой типов времени выполнения, которая позволяет вам определять
duck_type
тип, который объявляет объекты, имеющие необходимый набор методов.Роли реализуются самими классами (или другими ролями), а также обеспечивают реализацию и поведение, а не только интерфейс. Но они также (по крайней мере, в Moose) обрабатывают такие вещи, как обнаружение конфликтов методов.
источник