Що я можу використовувати замість інтерфейсів у Ruby (чи будь-яку іншу динамічну мову)?


9

Моя мета - визначити контракти між класами.

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

Наприклад, у Java я можу визначити інтерфейс Персистора з такими методами, як get () та save (), а потім визначити клас JdbcPersistor з усіма методами, які мені потрібні для збереження в базі даних. І, можливо, ще один RestPersistor з іншими методами збереження на віддаленому резервері.

Я не прошу інтерфейсів у Ruby, просто щоб знати, чи є акуратний спосіб зберегти це розрізнення. Мені подобається Рубі, але я працював лише над невеликими проектами.


Я думаю, що це належить StackOverflow ...
thorsten müller

2
@thorsten Stack Overflow призначений для конкретних проблем із впровадженням (тобто є проблема в коді). Загальні питання дизайну програми є тематичними тут на Programmers.SE.

@Mark: дякую за виправлення. Я думав, що це занадто конкретно щодо Рубі (і пропустив останнє речення Уберто). Тож я оновив свої знання про частоту. (Все ще знаходжусь тут)
thorsten müller

+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 є протоколи. Але більшість ні. Щоб бути ефективною в динамічній мові, ви повинні забути те, що ви знаєте про мови, що мають статичний тип, сприйняти динамічний характер мови. Динамічно набрані мови, як правило, уникають використання інтерфейсів.


1

У Perl 5 і Мус, і Му надають ролі (або риси), які можуть вимагати впровадження певних методів. Moose також постачається із системою типу виконання, яка дозволяє визначити a duck_type, що є об'єктами, що оголошують тип, що мають необхідний набір методів.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.