2010-11-02 4 views
7

Wenn ich mehr über die Metaprogrammierung von Ruby gelesen habe, haben wir meistens mindestens zwei Lösungen gefunden, um ein Problem zu lösen. Bitte schauen Sie auf folgenden zwei Beispiele:Klasse vs Modul beim Entwurf von Ruby API?

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

class Student < Base 
    has_many :books 
end 

Ein anderer Stil:

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 

Aber wenn wir api entwerfen, müssen wir entscheiden, welche zu benutzen, aber ich möchte Ihre Ideen stellen und einige Best Practices, die die meisten Menschen bereits in ihren Bibliotheken implementiert haben.

Antwort

5

Wenn Ihr API die Basisfunktionalität bereitstellt, die durch den Client erweitert wird, dann sollten Sie Erbe bevorzugen.

Wenn Ihre API verschiedene Clients mit ihrer eigenen Basisfunktionalität erweitert, sollten Sie sich für Zusammensetzung entscheiden.

2

Sie haben eine Menge Theorien zu dieser Frage.

Ich bevorzuge die Komposition, weil sie das Verhalten auf diese Weise viel wiederverwendbarer macht, aber wenn man sich Rails ansieht, muss man die ActiveRecord :: Base-Klasse jedes Mal ableiten, wenn man ein Objekt in der Datenbank haben will. Wenn Sie sich DataMapper ansehen, ist das Gegenteil der Fall, da Sie nur DataMapper :: Resource benötigen.

Vererbung vs Komposition (über Module) ist ein großes Thema und die Frage, die Sie sich stellen müssen, kommt auf: wie kann ich die größere Entkopplung zwischen den Komponenten erreichen, die ich zur Verfügung stelle und einem anderen Benutzer bestehenden Code-Basis?

1

Ruby unterstützt nur einzelne Vererbung. Wenn der API-Client die Basisklasse erben muss, verliert er die Fähigkeit, andere Klassen zu erben. Mit Moduleinbindung machen Sie einen Code wie:

class Student < Person 
    include Base 
    has_many :books 
end 

Und so können Sie sowohl Person als auch Basis "erben".

jedoch klassische Erbe Syntax sieht natürlicher und weniger „Magie“

Verwandte Themen