抱歉这个蹩脚的头衔:我不知道怎么总结这个......
我有一组类是公式(或公式,如果你喜欢),以及其他一组类(称为外部类)将使用它们。
公式类有许多属性(比如大约20个)和计算函数。外部类是持久化类,因此具有公式类的所有属性以及它们自己的几个属性。
在我的系统中,用户可以配置要使用的公式类,并且实际上可以选择使用多个公式来计算比较报告。
我正试图弄清楚如何在inner.x = outer.x
代码的一行又一行之间在内部/公式类和外部/持久性类之间传递属性值。
在我看来,我不能使用:
class Outer
include Formula1
end
...因为我希望实际的Formula类可以配置。
我想到的一个想法是,我可以从我的外部类传递一个属性数组,并循环遍历它们send
,如下所示:
# not tested
['x', 'y', 'z'].each{|a|@formula.send("#{a.to_sym}=", self.send("#{a.to_sym}") }
我应该考虑的任何其他红宝石魔法或模式?
谢谢,
答案 0 :(得分:0)
我的ruby-fu很低,我可能错过了你的要求的一些微妙,所以这可能不是最好的选择,但你可以有一个模块,你可以在其上定义属性,然后在你的外部包含该模块公式类,如下:
module FormulaAttributes
attr_accessor :x, :y ...
end
class Formula1
include FormulaAttributes
end
class Outer1
include FormulaAttributes
attr_accessor :a, :b ...
end
答案 1 :(得分:0)
听起来你正在寻找插入公式的策略模式,如果你不想通过公式实例调用公式的属性,那么可能是Facade。
制定战略的简便方法是制作外部属性的一级方程式实例:
class Outer
attr_accessor :formula #this bit is Strategy
def x #this bit is Facade
@formula.x
end
def calculate #Facade
@formula.calculate
end
end
outer1 = Outer.new
outer1.formula = Formula17.new
#this is the same
outer1.formula.x = 2
outer1.x = 2
#these are the same
puts outer1.formula.x
puts outer1.x
#and these are the same
puts outer1.formula.calculate
puts outer1.calculate
#and this would be the same as the above
formula17 = Formula17.new
formula17.x = 2
outer1 = Outer.new
outer1.formula = formula17
要处理大量的访问器,也许你可以尝试方法丢失来调用,或者在调用方法时为你定义和调用方法?
def method_missing(meth, *args, &block)
if @formula.respond_to?(meth)
@formula.send(meth, *args, &block)
end
else
super(meth, *args, &block)
end
end