2012-05-24 10 views
9

Bezwzględność tytułu pytania jest tym, co próbuję rozwiązać. Przykład:Jak znaleźć "niezbędne" metody zapewniania interfejsu z mieszankami Ruby?

w Ruby, Enumerable jest interfejsem w pewnym sensie, że mogę zaimplementować coś i udokumentować ją jako:

def myfancymethod(please_pass_me_an_Enumerable_here) 

, ale z drugiej strony, Enumerable jest rodzajem amplifikacji interfejsu, który ma #każ jako jedną z jego metod. Jeśli mam klasę

class Foo 
    def each 
    :bar 
    end 
end 

Dla osób niezaznajomionych z Ruby, jeśli moduł mixin Enumerable w klasie, masz dziesiątki metod, które polegać tylko na #each metody dostarczenie rzeczy jak #map, #select itd

Mogę powiedzieć, że moja klasa Foo jest możliwa do zmienienia lub możliwa do zmienienia lub co? Jakie warunki opisują odpowiedź na „Co trzeba zrobić, aby być Enumerable?”, „No trzeba mieć #each”

Podobnie w Ruby

(Array.new.methods - Object.new.methods).size # 111 

Czy to znaczy, że do fałszywego Array interfejs, muszę wdrożyć 111 metod? Nie ma mowy, ale jak się dowiedzieć, jakie metody są "esencją" Array. czy to tylko #[], #[]= i #size? Jak to zrozumieć?

+1

Czy masz pytanie dotyczące tego terminu? Albo o tym, jak znaleźć "podstawowe" metody? –

+1

Myślę, że byłoby o wiele łatwiej odpowiedzieć w języku, który miał interfejsy. – Russell

+0

@SergioTulentsev to drugie byłoby niesamowite. Nadal nie wiem, jakie są "istotne" metody ActiveRecord lub Array. – ulver

Odpowiedz

4

Użytkownik może być zainteresowany this feature request, co sugeruje pewne ulepszenia architektury powszechnie używanej klasy Hash.

Smutna prawda to zapomnij o tym. W tym momencie Ruby nie ma nic takiego. Enumerable i Comparable są tak blisko, jak to tylko możliwe, a ich "kontrakt" jest jedynie kwestią dokumentacji.

Nawiasem mówiąc, uważam, że #size jest inną metodą, z której może korzystać Enumerable, choć jest to opcjonalne.

5

Myślę o słowie "contract". Przykładem jest umowa Enumerable "daj mi #each, a ja dam ci te wymyślne metody".

+0

Czy istnieje katalog wspólnych/istniejących "umów"? Nigdy czegoś podobnego nie widziałem w świecie Ruby. Widzę teraz, że w Javie śledzenie to jest niepotrzebne, ponieważ właśnie publikujesz klasę używaną jak "nowe Enumerable (Everyable source)" lub dziedziczenie. – ulver

+0

Również "Design by Contract" jest świetny, ale przechodzi do całej nauki o warunkach przed/po/niezmiennikach itp. Interesuje mnie tylko zestaw "podstawowych" interfejsów. – ulver

Powiązane problemy