Ruby-メソッド間でインスタンス変数とパラメーターを使用する場合


8

他のメソッドを呼び出すメソッドをいくつか書いています。

情報を渡すには、いくつかの選択肢があります。

  1. 情報をパラメーターとして渡す

  2. 他のメソッドがインスタンス変数にアクセスできるようにインスタンス変数を設定します

どちらのオプションをいつ選択すればよいですか?

渡されるものについて非常に具体的であるため、最初のオプションは良いようです。欠点は、多くの値が渡されていることです。

2番目の方法はすべての値を渡す必要はありませんが、メソッドがインスタンス変数を「どこかに」設定するという多くの魔法につながるようです

クラス内の他のメソッドに渡されることについて常に明示する必要がありますか?例外はありますか?


2
多くの場合、オプション#2を使用して誰かが作成したコードの変更またはバグ修正を行う機会がありました。これは通常、複雑な混乱であり、変更には非常に時間がかかります。すべてを整理した後でも、変数が初期化または更新されるタイミングと場所を正確に維持する必要があるため、変更を行うには多くの精神的な努力が必要です。
Wily博士の実習生

回答:


12

それは、クラス全体に関するこれらの変数の役割に依存します。

クラスが小さく、これらの変数が転送する情報がクラスのすべてまたはほとんどすべてに関連している場合、それらをインスタンス変数として持つことは理にかなっています。銀行口座オブジェクトは、とにかくほとんどのアクションについてその所有者を知る必要があるので、無期限にそれを保持することは理にかなっています。

データがこのメソッドとそのヘルパーに非常に固有である場合、それらはパラメーターとして移動する必要があります。トランザクションの日付は、そのアカウントで行われた単一のアクションの場合ほど、アカウントの機能ではありません。(これらのパラメーターが複数あり、それらが単位として渡される傾向がある場合(例:日付、時刻、タイムゾーン)、パラメーターのを維持するためにそれらをヘルパーオブジェクトにバンドルすることも賢明です。ダウン。)


14

私の要点を明確にするためにあなたを間違って引用させてください:

他の関数を呼び出す関数をいくつか書いています。情報を渡すには、2つの選択肢があります。

  1. 情報を引数として渡します。
  2. グローバル変数を使用します。

どちらのオプションをいつ選択すればよいですか?

一般に、非ローカルな状態は悪い考えであると認識されています。したがって、一般に、共通のスコープ内の変数ではなく、パラメーターを使用して情報を渡す必要があります。これは、関連情報をオブジェクトまたは構造体にグループ化すると、より管理しやすくなります。

あまりにも多くのパラメータを渡すこと、コードのにおい、そしておそらくさらにいくつかのクラスを使用するようにリファクタリングすることができます。あなたがアドレス帳を書いていて、メソッドを持っているという病理的なケースを想定してくださいadd_contact(surname, firstname, fullname, ...)Name住所の一部と同様に、それをクラスにグループ化することをお勧めしますadd_contact(name, address)

ただし、関数に必要なパラメーターがまったく無関係である場合は、メソッドがやりすぎている可能性があり、小さな部分にリファクタリングする必要があります。

インスタンス変数を使用することは良い解決策だとは思いません。それは状態の不必要な変更であり、グローバル変数のすべての問題を小規模にもたらします。この方法は、デバッグ不可能なスパゲッティコードです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.