Программные инструменты Brian W. Kernighan и P. J. Plauger
Это имело глубокое влияние на то, как я пишу программное обеспечение.
Я думаю, что идея в том, что ActiveRecord считает аспект, поддерживаемый базой данных, ключевой особенностью класса модели, поэтому наследует это поведение. Похоже, DataMapper считает, что поддержка базы данных - это просто аспект класса, который может быть добавлен к классу.
Это мое предположение. Иегуда Кац мог бы сказать вам определенно.
Он позволяет вам наследовать от другого класса, который не является классом DM.
Он также позволяет добавлять функции DM к классу на лету. Вот метод класса из модуля, над которым я сейчас работаю:
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
Это позволяет мне взять класс SAXMachine (очень легкий) и на лету превратить его в класс Datamapper, и делать с ним всякие DataMappery. Вы можете даже использовать его в одноэлементном классе объекта.
Мне нравится представлять, что это снижает объем моей памяти, когда я импортирую 100 КБ объектов из XML (я не использую DM для массового импорта) и только смешиваю более сложные функции базы данных, когда они мне нужны
На самом деле это вопрос выбора наследования или композиции.
Я лично предпочитаю композицию, поскольку она кажется более естественным способом построения классов и объектов.
Композиция дает вам больше возможностей. контроль над тем, какое поведение вы хотите включить в свой класс. По наследству вы получаете либо все, либо ничего. Композиция позволяет вам выбрать то, что вам нужно.
Шаблон DataMapper предназначен для обеспечения уровня, который позволяет объектной модели предметной области отклоняться от схемы. ActiveRecord объединяет объектную модель и структуру реляционной базы данных.
за Мартин Фаулер :
Объекты и реляционные базы данных имеют разные механизмы для структурирования данных. Многие части объекта, такие как коллекции и наследование, отсутствуют в реляционных базах данных. Когда вы создаете объектную модель с большим количеством бизнес-логики, полезно использовать эти механизмы, чтобы лучше организовать данные и связанное с ними поведение. Это приводит к изменению схем; то есть схема объекта и реляционная схема не совпадают.
Вам по-прежнему необходимо передавать данные между двумя схемами, и эта передача данных сама по себе становится сложной. Если объекты в памяти знают о структуре реляционной базы данных, изменения в одной имеют тенденцию переходить в другую.
Data Mapper - это уровень программного обеспечения, который отделяет объекты в памяти от базы данных. В его обязанности входит передача данных между ними, а также их изоляция друг от друга. С помощью Data Mapper объекты в памяти не должны знать даже о наличии базы данных; они не нуждаются в коде интерфейса SQL и, конечно же, в знании схемы базы данных. (Схема базы данных всегда игнорирует объекты, которые ее используют.) Поскольку это форма Mapper (473), сам Data Mapper неизвестен даже уровню домена.