2010-11-02 12 views
7

Kiedy przeczytałem więcej o metaprogramowaniu Ruby, większość czasu znaleźliśmy co najmniej dwa rozwiązania, aby rozwiązać problem. Proszę spojrzeć na dwóch przykładach poniżej:Klasa vs Moduł w projektowaniu API Ruby?

class Base 
    def self.has_many(*args) 
    # ... 
    end 
end 

class Student < Base 
    has_many :books 
end 

inny styl:

module Base 
    def self.included(klass) 
    klass.extend ClassMethods 
    end 

    module ClassMethods 
    def has_many(*args) 
     # ... 
    end 
    end 
end 

class Student 
    include Base 

    has_many :books 
end 

ale kiedy zaprojektować api, musimy zdecydować, który z nich korzystać, ale chciałbym zadać swoje pomysły i niektóre najlepsze praktyki, które większość ludzi wdrożyła już w swoich bibliotekach.

Odpowiedz

5

Jeśli API dostarcza funkcjonalność podstawową, która będzie przedłużony przez klienta, a następnie należy wolisz dziedziczenie.

Jeśli twój interfejs API ma rozszerzać różnych klientów z ich podstawową funkcjonalnością, powinieneś wybrać skład.

2

Masz wiele teorii dotyczących tego pytania.

Preferuję kompozycję, ponieważ sprawia, że ​​zachowanie jest bardziej wielokrotnego użytku w ten sposób, ale jeśli spojrzeć na Rails, będziesz musiał podklasy klasy ActiveRecord :: Base za każdym razem, gdy chcesz obiektu w bazie danych. Jeśli spojrzeć na DataMapper, jest odwrotnie, ponieważ wymagało to włączenia DataMapper :: Resource.

Dziedziczenie vs Kompozycja (przez moduły) to duży temat, a pytanie, które należy zadać sobie, sprowadza się do: w jaki sposób mogę osiągnąć większe oddzielenie między dostarczanymi przeze mnie komponentami a istniejącą bazą kodów innego użytkownika?

1

Ruby obsługuje tylko pojedyncze dziedziczenie. Dlatego jeśli klient API musi dziedziczyć klasę podstawową, traci możliwość dziedziczenia innych klas. Korzystanie włączenia modułu ty możliwe uczynić kod jak:

class Student < Person 
    include Base 
    has_many :books 
end 

I tak można „dziedziczą” i osoba Base.

Jednak klasyczny składnia dziedziczenia wygląda bardziej naturalnie i mniej „magia”