2016-07-25 11 views
1

Personオブジェクトを初期化するための慣用方法は何ですか?私は個人的にはperson2を好むが、私はRubyを初めて使っている。Rubyクラスを初期化するための慣習的な方法

class Person 
    attr_reader :first, :middle, :last, :phone_number 

    def initialize(first, middle, last, phone_number) 
     @first = first 
     @middle = middle 
     @last = last 
     @phone_number = phone_number 
    end 
end 

if caller.length == 0 
    person1 = Person.new("John", "T", "Smith", "555-5555") 
    person2 = Person.new(
     first=  "John", 
     middle=  "T", 
     last=  "Smith", 
     phone_number="555-5555", 
    ) 
end 

答えて

3

通常ルビーでは、オブジェクトは、いずれかのようなperson1か、以下の方法で作成されます。

class Person 
    attr_reader :first, :middle, :last, :phone_number 

    def initialize(options) 
     @first = options[:first] 
     @middle = options[:middle] 
     @last = options[:last] 
     @phone_number = options[:phone_number] 
    end 
end 

person = Person.new(first: "John", middle: "T", last: "Smith", phone_number"555-5555") 

この代替アプローチについての素晴らしい事は、オプションで含めることができるということであるとして、多くのかなどの属性のように、いくつかのあなたは好きなだけでなく、任意の順序を許可します。

+0

ご返信ありがとうございます。私はPythonで 'def __init __(self、** kwargs)'と似たものを見たことがあります。私の個人的な意見では、これにより初期化子を読みにくくすることができます。 'options'や' ** kwargs'では、初期化子に渡すものについて何も教えてくれないので、オブジェクトを適切に初期化する方法を理解するために実装ロジックを掘り下げなければなりません。私は今、 'person1'の例に固執すると思います:) – Ben

1
person1 = Person.new("John", "T", "Smith", "555-5555") 

私の意見でより良いオプションです。同意しないものもありますが、ここで私はそれを考えています。

まず、コードをできるだけ読みやすくする必要があります。そのようにして、人々は何かが書かれている/構築されている方法を理解するために多くの質問をする必要はありません。それで、もしあなたがそれを第二のやり方でやるなら、あなたは説明を終わります。しかし、それを第2の方法でやってみると、あなたのコードを読んでいる人達には、それが初めてではなく書かれていないことを認めているようなものです。あなたのソフトウェアの開発者は、コンストラクタのパラメータ名を見ることができることを知っているか、IDEは既に自動ドキュメントの形式で指定しています。その後、上記の表記法の両方に代わる

person1 = Person.new("John Smith") 

またはより良いを次のようにコンストラクタで人物名を初期化するだろう...

person1 = Person.new() 

そして、何を説明するために、必要に応じてフィールドを設定します起こっている。二つ目は良く見えるかもしれませんなぜ私は完全に理解しながら

person1.address = "Blah street" 
person1.phoneNumber = "555-5555" 

さて、それは長期的には痛いです。不要なコードや、よりリーンなデザインや強力なツールを使用して削除する方が効果的です。

+0

ご返信ありがとうございます。明示的にフィールドを設定すると( 'person1.address =" blah "')、 'address'フィールドを' attr_reader'から 'attr_accessor'に変更する必要があります。繰り返しますが、私はRubyを初めて使っていますが、アクセス制御で可能な限り制限するのは意味がありませんか? – Ben

+1

正直言って、私はRubyの主要開発者ではありません。私はRubyで約2年間過ごしましたが、主にC#で働くので、私の提案は一粒の塩で行うべきです。できるだけ制限的になるということは、オブジェクトが存続中にどのように使用するかによって異なります。それが一種の定数として動作し、システムの各部分の間を渡されることになっているなら、私はコンストラクタの初期化や、あなたの環境に特化したもっと凝った言い方をします。それ以外の場合は、動作するいくつかのフォームのセッターを公開する必要があります。あなたが工場を使うことができる最高のケース。 – cmw2379

関連する問題