У меня есть класс с двумя состояниями, «State1» и «State2» (там может быть только два состояния, и она никогда не меняется с момента создания экземпляра) и следующий кодКак вызвать методы в зависимости от состояния экземпляра?
class MyClass
attr_accessor :myvar1, :myvar2, :state
include Extension1
include Extension2
def func1
send("#{self.state}_func1")
end
def otherfunc
send("#{self.state}_otherfunc")
end
def anotherfunc
send("#{self.state}_anotherfunc")
end
end
module Extension1 #handles state1 functions
def state1_func1
#do something using MyClass instance vars
end
def state1_otherfunc
#do something using MyClass instance vars
end
def state1_anotherfunc
#do something using MyClass instance vars
end
end
module Extension2 #handles state2 functions
def state2_func1
#do something using MyClass instance vars
end
def state2_otherfunc
#do something using MyClass instance vars
end
def state2_anotherfunc
#do something using MyClass instance vars
end
end
Как этот код может быть улучшен? (этот пример очень простой, фактический объект имеет сразу два атрибута состояния, и мне нужно переопределить события state_machine первого состояния на основе второго состояния)
К сожалению, это решение не сработало в моем случае. Я использую delayed_job для запуска переопределенных методов и кэширует все классы, которые он обрабатывает. поэтому, как только я инициализирую первый экземпляр, все остальные экземпляры выполняются независимо от их состояния. –
@PavelK., Я могу чувствовать запах анти-шаблона дизайна в 'delayed_job'. Параметризированное подклассирование и паттинг обезьян - это элементарные методы Ruby. Но я не хочу быть слишком суровым на них; Я написал достаточно проектов Ruby, чтобы узнать, как сложно сделать проект более полным, со всеми ожидаемыми шаблонами использования. –