2011-08-04 18 views
1

Rubyでクラスのインスタンス変数(例:@person_summary_info@name@dob@favorite_food)を作成しています。ruby​​メソッドがクラスのインスタンスメソッドを変更する必要がありますか?

テキストを解析するには、クラス外から呼び出すパブリックメソッドがあります(interpretとしましょう)。

このメソッドは、@person_summary_infoを使用するget_nameなどのプライベートクラスメソッドを呼び出して、それぞれの情報(この場合は、その人の名前)を抽出します。これらのプライベートメソッド必要があります。

A)@person_summary_infoインスタンスを使用し、またはそれらに渡されたパラメータを使用して、その情報を取得する(すなわちget_nameget_name(person_summary_info)対)

b)は、直接インスタンス変数を変更し、何も返さない、または変更します関数の範囲外で何も返さずに結果を返します(つまりget_nameの内部に@name = 'John'またはreturn 'John'を設定します)。

ここでベストプラクティスは何ですか? ありがとう!

+2

サンプルコードとして書き直せますか? –

+2

奨励金を申し出る場合は、質問を理解しやすくすることもできます。これをサンプルコードとして書き直せますか? –

+0

interpret()メソッドは、渡された文字列を解析し、それに応じてクラスの情報を設定するためのものですか? – Brady

答えて

1

...私は私の答えの下部にあるコードであなたの質問の私の最高の表現が含まれていたが、私が最初にあなたのジレンマを理解し、私は私の解決策を提示したいと思いますあなたの name属性がパブリックにアクセスすることを意図されている場合

はこれを行います。

class Person 
    attr_accessor :name 

    def initialize(name) 
    @name = name 
    end 

    def interpret(text_to_parse) 
    # I have no idea what you are parsing in real life 
    self.name = text_to_parse.split.last 
    end 
end 

person = Person.new("Frederick") 
puts person.name 
# => "Frederick" 
person.interpret("Please, call me Fred") 
puts person.name 
# => "Fred" 

をごname属性がn必要がある場合は、これを行います(簡単に)公にアクセスすることができます:(価値があるものについては、Rubyで何かにアクセスすることができます。 !それは素晴らしい作る多くの事の一つ)

class Person 
    def initialize(name) 
    @name = name 
    end 

    def interpret(text_to_parse) 
    # I have no idea what you are parsing in real life 
    @name = text_to_parse.split.last 
    end 
end 

person = Person.new("Frederick") 
puts person.instance_variable_get("@name") 
# => "Frederick" 
person.interpret("Please, call me Fred") 
puts person.instance_variable_get("@name") 
# => "Fred" 

そして、前述したように、ここではコードにあなたの質問の私の最高の翻訳です:

class Person 
    def initialize 
    @person_summary_info = { name: "foo" } 
    @name = "bar" 
    @dob = "baz" 
    @favorite_food = "beer" 
    end 

    def interpret(text_to_parse) 
    # Some kind of parsing? 
    get_name_1 
    # OR 
    get_name_2(@person_summary_info) 
    # OR 
    get_name_3 
    # OR 
    @name = get_name_4 
    end 

    private 
    def get_name_1 
    @person_summary_info[:name] 
    end 

    def get_name_2(person_summary_info) 
    person_summary_info[:name] 
    end 

    def get_name_3 
    @name = 'John' 
    end 

    def get_name_4 
    'John' 
    end 
end 

うまくいけば、あなたはなぜ見ることができますあなたが何を正確に求めているかについてのコメントには混乱があります。他に何もない場合は、これを見て、あなたの質問をより明確に表現するのに役立ちます。

最後に、あなたが取得/設定プロセスにいくつかのカスタムコードにフックする必要がない限り、Rubyで独自のゲッター/セッターを書くことは避けるべき - あなたのためにそれらを作成するために、クラスレベルにattr_reader/attr_writer/attr_accessorマクロを使用します。

1

Personの特定のインスタンスの状態を変更するためのものではない場合は、get_name_from_string(string)のような名前を付け、インスタンスの状態に対して何もしないため、静的にすることを検討してください。

Personの特定のインスタンスの状態を変更するためにinterpret()を使用する場合は、メソッドの名前を変更し、setを接頭辞として使用し、設定されている属性名を組み込みます(set_name_from_string())。いくつかの属性が設定されている場合は、おそらくset_from_string()を呼び出し、変更されているインスタンス変数を示すコードコメントを追加します。内部的には、メソッドはget/set_name()を以下のように呼び出すことができます。

通常、getter/setterメソッドが公開され、非常にシンプルである必要があり、その名前が何をやって: - のgetName()は、インスタンス変数@name を返します - のsetName(名)とインスタンス変数@nameを設定したり上書き渡された値は返されません。

Javaでは、これはPOJOのタイプです。具体的には、Java Beans(シリアライズ可能にする部分を除く)です。パブリックセッター/ゲッターメソッドを持つために、インスタンス変数のインスタンス化時にインスタンス変数を設定できるようにするデフォルトのコンストラクタ(引数を取らないコンストラクタ)と別のコンストラクタを持つこともできますect。

1

別のクラスから直接@instanceを使用すると、問題になる方法があります。各クラスは、それが自身の変数とあなたが処理したり、割り当てられている必要があり戻らたい何かをだ持っている必要があります/直接返さ..それは

@instance = my_class.get_name(person_summary_info) 

なく

my_class.get_name 

がどれだけ想像してみてくださいその方法を意味し、 @instance変数とそのコードを再利用する機会を使ってそのコードをテストする

ちょうど私の2cを

関連する問題