2010-10-14 2 views
1

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

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

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

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

ответ

0

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

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 (продукт, количество) реализуется как add_product (продукт, количество, * custom_data), а если custom_data равно нулю, тогда вызывается метод super, эффективно вызывающий метод, реализованный в BoxStandardMethods

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

Смежные вопросы