Czego mogę używać zamiast interfejsów w Ruby (lub innym dynamicznym języku)?

9

Moim celem jest zdefiniowanie umów między klasami.

Lubię pisanie kaczką i wszystko, ale chciałbym również zdefiniować interfejs między różnymi warstwami mojej aplikacji, aby jasno określić, które są metodą wywoływania z zewnętrznego, a które to metody dodatkowe, których nie powinna używać druga warstwa .

Na przykład w Javie mogę zdefiniować interfejs Persistor za pomocą metod takich jak get () i save (), a następnie zdefiniować klasę JdbcPersistor za pomocą wszystkich metod, które muszę zachować w bazie danych. I może inny RestPersistor z innymi metodami oszczędzania na zdalnym serwerze.

Nie pytam o interfejsy w Ruby, tylko po to, aby wiedzieć, czy istnieje dobry sposób, zachowaj to rozróżnienie. Lubię Ruby, ale pracowałem z nią tylko przy małych projektach.

Uberto
źródło
Myślę, że należy do StackOverflow ...
thorsten müller
2
Przepełnienie stosu @ thorsten dotyczy określonych problemów z implementacją (tj. występuje problem z kodem). Ogólne pytania dotyczące projektowania programu są na ten temat na Programmers.SE.
@ Mark: dzięki za korektę. Myślałem, że jest zbyt specyficzny dla Ruby (i przegapiłem ostatnie zdanie Uberto). Zaktualizowałem więc swoją wiedzę na temat często zadawanych pytań. (Wciąż znajduję się tutaj)
Thorsten Müller
+1 Doskonałe pytanie. Interesuje mnie, czy istnieje jakikolwiek inny sposób niż pisanie, czytanie i aktualizowanie ton dokumentacji lub stosowanie głupich konwencji, takich jak poprzedzanie wewnętrznych metod akcesorium podkreśleniami lub coś w tym rodzaju.
Joonas Pulakka
+1 Nawiasem mówiąc, rakieta PLT ma obsługę kontraktów i jest dynamiczna. Dodanie czegoś podobnego do Ruby byłoby ciekawym projektem.
Larry Coleman

Odpowiedzi:

5

Odpowiedzi udzielono w kontekście interfejsów C # i Ruby na stackoverflow: /programming/3505521/in-ruby-what-is-the-equivalent-to-an-interface-in-c .

Podsumowując: w Rubim nie ma dokładnego odpowiednika, ponieważ pisanie kaczych sprawia, że ​​formalny interfejs nie jest potrzebny. Zamiast tego rozważ przetestowanie pod kątem zgodności z „interfejsem” lub wykorzystaniem umowy respond_to?.

Corbin March
źródło
2
tak, ale to nie uniemożliwia kodowi dostępu do metody, której nie powinien
Uberto
2

Niektóre dynamicznie pisane języki mają interfejsy lub podobną koncepcję. Na przykład Objective-C ma protokoły. Ale większość nie. Aby być skutecznym w języku dynamicznym, musisz zapomnieć o tym, co wiesz o językach o typie statycznym, przyjąć dynamiczną naturę języka. Dynamicznie pisane języki na ogół unikają używania interfejsów.

mipadi
źródło
1

W Perlu 5 zarówno Łoś , jak i Moo zapewniają role (lub cechy), które mogą wymagać implementacji określonych metod. Łoś posiada także system typu runtime, który pozwala zdefiniować duck_typetyp, który deklaruje obiekty posiadające wymagany zestaw metod.

Role są implementowane przez same klasy (lub inne role), a także zapewniają implementację i zachowanie, nie tylko interfejs. Ale oni także (przynajmniej w Moose) radzą sobie z takimi rzeczami, jak wykrywanie konfliktów metod.

phaylon
źródło