2010-11-02 12 views
7

Cuando leo más acerca de la metaprogramación de Ruby, la mayoría de las veces encontramos al menos dos soluciones para resolver un problema. Por favor tener en cuenta dos ejemplos siguientes:Clase vs Módulo en el diseño de Ruby API?

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

class Student < Base 
    has_many :books 
end 

Otro estilo:

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 

Pero cuando diseñamos API, tenemos que decidir cuál usar, pero me gustaría pedir a sus ideas y algunos de las mejores prácticas que la mayoría de las personas ya han implementado en sus bibliotecas.

Respuesta

5

Si su API está proporcionando la funcionalidad básica que se extenderá por el cliente, a continuación, se debe preferir herencia.

Si su API va a extender varios clientes con su propia funcionalidad base, entonces debe ir por composición.

2

Tienes muchas teorías sobre esta cuestión.

Tiendo a preferir la composición porque hace que el comportamiento sea mucho más reutilizable de esa manera, pero si miras a Rails, deberás subclasificar la clase ActiveRecord :: Base cada vez que quieras a un objeto en tu base de datos. Si miras DataMapper, es todo lo contrario, ya que solo requieren que incluyas DataMapper :: Resource.

Herencia vs Composición (a través de módulos) es un gran tema y la pregunta que debe hacerse se reducirá a: ¿cómo puedo lograr un mayor desacoplamiento entre los componentes que proporciono y otro código de usuario base existente?

1

Ruby solo admite herencia única. Por lo tanto, si el cliente API debe heredar su clase base, pierden la capacidad de heredar otras clases. El uso de la inclusión del módulo de hacer posible un código como:

class Student < Person 
    include Base 
    has_many :books 
end 

Y así se puede "heredar" tanto la persona como base.

Sin embargo, la sintaxis de la herencia clásica parece más natural y menos "mágica"

Cuestiones relacionadas