Почему DataMapper использует mixins по сравнению с наследованием?

Программные инструменты Brian W. Kernighan и P. J. Plauger

Это имело глубокое влияние на то, как я пишу программное обеспечение.

5
задан Simone Carletti 24 July 2009 в 21:50
поделиться

4 ответа

Я думаю, что идея в том, что ActiveRecord считает аспект, поддерживаемый базой данных, ключевой особенностью класса модели, поэтому наследует это поведение. Похоже, DataMapper считает, что поддержка базы данных - это просто аспект класса, который может быть добавлен к классу.

Это мое предположение. Иегуда Кац мог бы сказать вам определенно.

3
ответ дан 13 December 2019 в 05:40
поделиться

Он позволяет вам наследовать от другого класса, который не является классом 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 для массового импорта) и только смешиваю более сложные функции базы данных, когда они мне нужны

5
ответ дан 13 December 2019 в 05:40
поделиться

На самом деле это вопрос выбора наследования или композиции.

Я лично предпочитаю композицию, поскольку она кажется более естественным способом построения классов и объектов.

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

0
ответ дан 13 December 2019 в 05:40
поделиться

Шаблон DataMapper предназначен для обеспечения уровня, который позволяет объектной модели предметной области отклоняться от схемы. ActiveRecord объединяет объектную модель и структуру реляционной базы данных.

за Мартин Фаулер :

Объекты и реляционные базы данных имеют разные механизмы для структурирования данных. Многие части объекта, такие как коллекции и наследование, отсутствуют в реляционных базах данных. Когда вы создаете объектную модель с большим количеством бизнес-логики, полезно использовать эти механизмы, чтобы лучше организовать данные и связанное с ними поведение. Это приводит к изменению схем; то есть схема объекта и реляционная схема не совпадают.

Вам по-прежнему необходимо передавать данные между двумя схемами, и эта передача данных сама по себе становится сложной. Если объекты в памяти знают о структуре реляционной базы данных, изменения в одной имеют тенденцию переходить в другую.

Data Mapper - это уровень программного обеспечения, который отделяет объекты в памяти от базы данных. В его обязанности входит передача данных между ними, а также их изоляция друг от друга. С помощью Data Mapper объекты в памяти не должны знать даже о наличии базы данных; они не нуждаются в коде интерфейса SQL и, конечно же, в знании схемы базы данных. (Схема базы данных всегда игнорирует объекты, которые ее используют.) Поскольку это форма Mapper (473), сам Data Mapper неизвестен даже уровню домена.

4
ответ дан 13 December 2019 в 05:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: