Я бы сказал: «Да, это грязно». Ваше намерение состоит не в изменении поведения метода «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