2017-12-03 1 views
1

私はコードの匂いかもしれないと思うこの問題を抱えています。私はその初期設定で引数を受け取り、1つの公開といくつかのプライベートメソッドを含むクラスを持っています。例:Rubyクラス、メソッドの前後で引数が渡される、インスタンス変数?

class Foo 
    def initialize(a) 
    @a = a 
    end 

    def apply?(examples) 
    foo_1(examples) 
    end 

    private 

    def foo_1(examples) 
    foo_2(examples) ? 1 : 2 
    end 

    def foo_2(examples) 
    examples.size > @a 
    end 
end 

ここに私の問題は、パブリックメソッドが周りを超えるとプライベートメソッドを介して実行されることによって受信された「例」であり、何、それはかなり見ていないと、それはコードのにおいのように思えますここに最善のアプローチ?パブリックメソッド内のインスタンス変数にしますか?

おかげ

+0

クエリオブジェクトは「Tell Do not Ask」に違反し、戻り値の型は「Duck Typing」を使用していないことを示します。私は、純粋なオブジェクト指向の実装について、今後のトラブルを避けるために再考することを提案します。 –

+1

実際の要件に関する情報があまりにも少なく、実際の使用例はありません。通常、その欠如は建設的な議論のためには問題ないかもしれませんが、これは良いデザインパターンに関するものなので、もっと多くの情報が本当に必要です。それ以外の場合は、イニシャライザにサンプルを追加し、すべてのクエリのクラスをインスタンス化することは合理的な解決策になるかもしれません。 – mdrozdziel

答えて

2

examplesを受け入れて、プライベートメソッドの数が1〜2よりも大きい場合は、[はい、これはコードのにおいと考えることができます。

ここではruleを表すクラスを抽出することを考慮する必要があります。例えば

:それはそのオブジェクトへの呼び出しの間メモリに固執しまう危険性がありますよう

class Foo 
    def initialize(a) 
    @a = a 
    end 

    def apply?(examples) 
    size_rule_applies?(examples) ? 1 : 2 
    end 

    private 

    def size_rule_applies?(examples) 
    SizeRule.new(@a, examples).apply? 
    end 

    class SizeRule 
    def initialize(a, examples) 
     @a  = a 
     @examples = examples 
    end 

    def apply? 
     @examples.size > @a 
    end 
    end 
end 

私はFooクラスのインスタンス変数examplesをすることはないだろう。私はそのようなバグを見た。

+1

とにかくすべてのクエリに対してSizeRuleクラスの新しいインスタンスを作成しているので、 'Foo'のイニシャライザに' examples'を追加してみませんか? – mdrozdziel

+0

'a'が常にセットされた' Foo'のインスタンスを1つだけ持つことができますが、このオブジェクトを複数回使用して毎回異なる 'examples'を持つ' apply? 'を求めます。少なくとも、それは私がここでこの設定を理解する方法です。 –

0

examplesが動的に変更された場合、そのインスタンス変数を変更することはオプションではありません。 examplesごとにFooをインスタンス化する必要があります。examples自体が変更されている可能性があります。Fooが変更される可能性があります。

コードは正常です。私に関係する唯一のことは、ある方法は別の方法に依存するということです。これは通常、大したことではないのですが、これは私には良くなります

def apply?(examples) 
    foo_1(examples) && foo_2(examples) 
    end 
0

別のオプションは、ブロックを使用することです:

class Foo 
    def initialize(a) 
    @a = a 
    end 

    def apply?(examples) 
    foo_1 { examples } 
    end 

    private 

    def foo_1 
    v = foo_2 { yield.size } 
    v ? 1 : 2 
    end 

    def foo_2 
    yield > @a 
    end 
end 
0

クラスFooが現在ちょうど私が意志.apply?(examples)を評価するよりも、他には何もしませんので、アドバイスの例をイニシャライザに追加し、インスタンス変数を作成します。これは、より簡単で、より効率的で、より明白です。

class Foo 
    def initialize(a, examples) 
    @a = a 
    @examples = examples 
    end 

    def apply? 
    foo_1 
    end 

    private 

    def foo_1 
    foo_2 ? 1 : 2 
    end 

    def foo_2 
    @examples.size > @a 
    end 
end 
関連する問題