2009-07-24 9 views
5

So bin ich darüber nur neugierig:Warum verwendet DataMapper Mixins vs Vererbung?

DataMapper

class Post 
    include DataMapper::Resource 

eine mixin für seine Modelle verwendet Während aktiven Datensatz Vererbung verwendet

class Post < ActiveRecord::Base 

Weiß jemand, warum DataMapper zu tun wählte es auf diese Weise (oder warum AR nicht gewählt hat)?

Antwort

3

Ich denke, die Idee ist, dass ActiveRecord das datenbankgestützte Aspekt als das Schlüsselmerkmal einer Modellklasse betrachtet, so dass es dieses Verhalten erbt. DataMapper sieht so aus, als würde es sich bei der Datenbank-Unterstützung nur um einen Aspekt einer Klasse handeln, die einer Klasse hinzugefügt werden kann.

Das ist meine Vermutung. Yehuda Katz könnte es dir definitiv sagen.

+0

Ich dachte, es könnte ein rein "philosophischer" Grund sein - Mal sehen, was andere Leute sagen. – cloudhead

5

Damit können Sie von einer anderen Klasse erben, die keine DM-Klasse ist.

Es ermöglicht auch das Hinzufügen der DM-Funktionen zu einer Klasse im laufenden Betrieb. Hier ist eine Klassenmethode aus einem Modul ich arbeite jetzt:

def datamapper_class 
    klass = self.dup 
    klass.send(:include, DataMapper::Resource) 
    klass.storage_names[:default] = @table_name 
    klass.property(:id, DataMapper::Types::Serial) 
    klass.property(:created_at, DateTime, :nullable => false) 
    klass.property(:updated_at, DateTime, :nullable => false) 
    columns_with_types { |n, t| klass.property(n, t, :field => n.to_s) } 
    klass 
end 

Auf diese Weise können Sie mir eine SAXMachine Klasse nehmen (sehr leicht) und schalten Sie ihn in eine Datamapper Klasse on the fly, und zu tun DataMappery Sachen mit ihm . Du könntest es sogar zu einer Singleton-Klasse eines Objekts machen.

Ich stelle mir vor, dass dies meinen Speicherbedarf verringert, wenn ich 100K-Objekte aus XML importiere (ich verwende kein DM für die Massenimporte) und mische nur die komplexeren Datenbankfunktionen, wenn ich sie brauche

+0

interessant, daran hatte ich nicht gedacht. – cloudhead

0

Dies ist wirklich die Frage der Wahl von Vererbung vs Zusammensetzung.

Ich persönlich bevorzuge die Komposition, da es scheint, eine natürlichere Art zu sein, Klassen und Objekte zu konstruieren.

Komposition gibt Ihnen mehr Kontrolle darüber, welche Verhaltensweisen Sie in Ihre Klasse aufnehmen möchten. Was die Vererbung angeht, bekommt man entweder alles oder nichts. Komposition ermöglicht es Ihnen, die gewünschten Verhaltensweisen auszuwählen.

+1

Mixins haben nichts mit Zusammensetzung zu tun. Wie bei der Vererbung ist ein Mixin ein Alles-oder-Nichts-Vorschlag. Im Gegensatz zur Komposition können Sie das Objekt, das zur Laufzeit gemischt wird, nicht ändern. – KaptajnKold

4

Das DataMapper-Muster soll eine Ebene bereitstellen, die es dem Domänenobjektmodell ermöglicht, vom Schema abzuweichen. ActiveRecord vereinheitlicht das Objektmodell und die relationale Datenbankstruktur.

pro Martin Fowler:

Objekte und relationale Datenbanken haben unterschiedliche Mechanismen zur Strukturierung von Daten. Viele Teile eines Objekts, z. B. Sammlungen und Vererbung, sind in relationalen Datenbanken nicht vorhanden. Wenn Sie ein Objektmodell mit viel Geschäftslogik erstellen, ist es nützlich, diese Mechanismen zu verwenden, um die Daten und das damit verbundene Verhalten besser zu organisieren. Dies führt zu Variantenschemas. Das heißt, das Objektschema und das relationale Schema stimmen nicht überein.

Sie müssen immer noch Daten zwischen den beiden Schemas übertragen, und diese Datenübertragung wird zu einer eigenen Komplexität. Wenn die Objekte im Speicher über die Struktur der relationalen Datenbank Bescheid wissen, tendieren Änderungen in der einen dazu, sich gegenseitig zu verstärken.

Der Data Mapper ist eine Softwareschicht, die die In-Memory-Objekte von der Datenbank trennt. Ihre Aufgabe besteht darin, Daten zwischen den beiden zu übertragen und sie voneinander zu isolieren. Mit Data Mapper müssen die In-Memory-Objekte nicht einmal wissen, dass eine Datenbank vorhanden ist. Sie benötigen keinen SQL-Schnittstellencode und sicherlich keine Kenntnis des Datenbankschemas. (Das Datenbankschema kennt die Objekte, die es verwenden, immer nicht.) Da es sich um eine Form von Mapper (473) handelt, ist Data Mapper selbst der Domänenebene unbekannt.

0

ActiveRecord sollte wirklich keine Vererbung verwenden, sondern ein Modul hinzufügen, um einem Modell/einer Klasse das Verhalten (hauptsächlich Persistenz) hinzuzufügen. ActiveRecord verwendet einfach das falsche Paradigma!

Aus dem gleichen Grund mag ich MongoId über MongoMapper sehr, weil es dem Entwickler die Möglichkeit gibt, Vererbung als eine Möglichkeit zu verwenden, um etwas Sinnvolles in der Problemdomäne zu modellieren.

Es ist traurig, dass so ziemlich niemand in der Rails-Gemeinschaft "Ruby-Vererbung" so verwendet, wie es verwendet werden soll - um Klassenhierarchien zu definieren, nicht nur um Verhalten hinzuzufügen.