2011-01-18 11 views
2

:私はこの1つを合計するかどうかはわかりません...ルビーラメタイトルのために申し訳ありませんが、パターンの質問

(あなたが好きな場合や数式)私は式ですクラスのセットを持っており、他のセットそれらを利用するクラス(外部クラスと呼ぶ)のクラス

数式クラスには多くの属性(約20など)とcalculate関数があります。外部クラスは永続クラスであるため、数式クラスのすべての属性を持ち、独自の属性をいくつか持ちます。

私のシステムでは、ユーザーはどのフォーミュラクラスを使用するかを設定できます。たとえば、比較レポートに複数の式を使用して計算することもできます。

inner.x = outer.xコードの行の後に、inner/formulaクラスとouter/persistenceクラスの間で属性値をどのように転送できるかを検討しています。

私が使用できないように私には思える:

class Outer 
    include Formula1 
end 

を...私は、実際の式のクラスが設定できるようにしたいので。心にスプリング

ひとつのアイデアは、私はこのように私の外側のクラスから伝承する属性の配列、およびループそれらを超えるとsend、何かを持っている可能性がある。

# not tested 
['x', 'y', 'z'].each{|a|@formula.send("#{a.to_sym}=", self.send("#{a.to_sym}") } 

その他のルビーの魔法またはパターン私は検討すべきだろうか?

おかげで、

答えて

0

サウンズ:このようなあなたの外側とフォーミュラクラスでモジュールが、ことを含んでアトリビュートを計算します。戦略を作るために

簡単な方法は、外の属性の式1のインスタンスを作ることです。

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 

アクセサの多くに対処するために、おそらくあなたは、どちらかのコールに不足している方法を試してみてください、または定義することができます彼らが呼ばれているようにあなたのためのメソッドを呼び出すか?

+0

私は、Outerから@formulaに属性がありますが、多くのものがありますが、すべての手動の​​通過を避けようとしています。 – Rob

+0

@Robこれを動的に処理するための答えにいくつかのコードを追加しました。 – iain

+0

ああmethod_missing ...ニース! – Rob

0

マイルビー-FUが低く、私はおそらくあなたの条件のいくつかの微妙をしないのですので、これはおそらく最良の選択肢ではありませんが、あなたはその後、属性を定義し、その上にモジュールを持つことができますあなたが式のを呼び出すにしたくない場合は、多分、その後ファサードを式に差し込むとするStrategyパターンを探しているよう

module FormulaAttributes 
    attr_accessor :x, :y ... 
end 

class Formula1 
    include FormulaAttributes 
end 

class Outer1 
    include FormulaAttributes 
    attr_accessor :a, :b ... 
end 
関連する問題