2010-11-02 2 views
7

Когда я больше читал о метапрограммировании Ruby, большую часть времени мы нашли по крайней мере два решения для решения проблемы. Посмотрите, пожалуйста, на двух примерах ниже:Класс против модуля в разработке Ruby API?

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

class Student < Base 
    has_many :books 
end 

Другой стиль:

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 

Но когда мы проектируем API, мы должны решить, какой из них использовать, но я хотел бы спросить ваши идеи и некоторые из которые большинство людей уже реализовали в своих библиотеках.

ответ

5

Если API предоставляет базовую функциональность, которая будет распространена клиентом, то вам следует предпочесть наследство.

Если ваш API собирается расширить различные клиенты с их собственной базой функциональности, то вы должны пойти на состав.

2

У вас много теорий вокруг этого вопроса.

Я предпочитаю композицию, потому что это делает поведение намного более многоразовым, но если вы посмотрите на Rails, вам придется подклассифицировать класс ActiveRecord :: Base каждый раз, когда вы захотите использовать объект в своей базе данных. Если вы посмотрите на DataMapper, это наоборот, поскольку вам просто нужно включить DataMapper :: Resource.

Наследование и композиция (через модули) - это большая тема, и вопрос, который вам придется задать самому себе, сводится к: как я могу добиться большей развязки между предоставляемыми мной компонентами и другой существующей кодовой базой?

1

Ruby поддерживает только одно наследование. Поэтому, если API-клиент должен наследовать ваш базовый класс, они теряют способность наследовать другие классы. Используя включение модуля, вы можете сделать такой код как:

class Student < Person 
    include Base 
    has_many :books 
end 

И таким образом вы можете «наследовать» как Личность, так и основание.

Однако классический синтаксис наследования выглядит более естественным и менее «магия»

Смежные вопросы