Наглядываются ли методы наложения псевдонимов?

Ответов: 4


2 принят

Я бы сказал: «Да, это грязно». Ваше намерение состоит не в изменении поведения метода «destroy», а в том, чтобы выполнить некоторую работу, связанную с конкретным доменом, а затем запустить destroy. Ваш первый подход велик - определите метод, который делает то, что вы хотите, и вызовите destroyпри необходимости. Я думаю, что метод «wrapping» или «monkey-patching», как вы думаете, является методом, который лучше всего применять, когда стандартные подходы OO не могут использоваться - например, когда вам нужно изменить / увеличить поведение в класс, который определяется и используется вне вашей сферы контроля.

Даже если вы которые с учетом изменения поведения destroyсамого метода, я хотел бы предложить перекрывая метод здесь, а не окружив его:

def destroy(options = {})
  restock_products if options['restock']
  super() # I think parens are necessary here, to avoid passing options up the chain
end

0

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

def destroy_after &block
  yield if block
  destroy
end

Затем назовите его так:

order.destroy_after { order.restock_products }

Я не могу придумать хорошее имя для этой функции ... но я надеюсь, что вы поняли эту идею.


0

Гораций, я неправильно понял ваш вопрос. Я думаю, вы ищете это:

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

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

Удачи.


0

Если патч обезьяны не позволяет вам спать по ночам, вы можете добиться того же самого путем подкласса. Когда мне нужно быстро взломать или быстро взломать, я тоже заплачу обезьянке.

рубин-на-рельсы, электронная коммерция, псевдоним,
Похожие вопросы
Яндекс.Метрика