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.
źródło
Odpowiedzi:
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?
.źródło
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.
źródło
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_type
typ, 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.
źródło