Определение поведения объекта с использованием полиморфного наследования - PullRequest
1 голос
/ 15 октября 2010

Сегодня я столкнулся с проблемой создания различных моделей поведения для моей модели корзины покупок.Это потому, что владелец интернет-магазина хотел создать несколько рекламных акций, таких как купить 1, получить 5 или получить скидку 25% + некоторые дополнительные вещи и т. Д.

1002 * Я думал сделать это с полиморфным наследованием, где мойМодель корзины будет содержать только купленные товары и аксессуары и будет иметь множество «моделей поведения», где она получит свои данные, такие как сумма покупки (которая может получить скидку 25%), и вызовет методы, подобные тому, который закрывает сделку.(где я мог бы добавить новые, определенные продукты для рекламных акций, где вы получаете что-то 5 бесплатно).

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

Знаете ли вы лучший способ?

1 Ответ

0 голосов
/ 28 октября 2010

Я решил это, используя немного метапрограммирования!Теперь моя модель корзины работает так:

  def after_initialize

    extend BoxStandardMethods

    if self.box_behavior_type?
      extend Object.const_get(box_behavior_type)
    end
  end

, где BoxStandardMethods - это модуль, который имеет все методы, которые есть в стандартной корзине (add_product, remove_product, get_total и т. Д.), И если я хочу переопределить любой из этих методов, я просто устанавливаю атрибут box_behavior_type корзины с модулем, который имеет функции, которые я хочу переопределить.Чтобы избежать несовместимости с интерфейсами, я создаю расширяемые модули с настраиваемыми полями, которые обратно совместимы, т.е.стандартный метод add_product (product, amount) реализован как add_product (product, amount, * custom_data), и если custom_data равен nil, то вызывается супер-метод, эффективно вызывающий метод, реализованный в BoxStandardMethods

Ruby простоотлично подходит для такого подхода!Система работает около недели, и у меня не было никаких проблем!

...