パラメータを渡すタイミングとインスタンス変数を使用するタイミング

StackOverflow https://stackoverflow.com/questions/346169

  •  19-08-2019
  •  | 
  •  

質問

ローカルで何かを追跡し、それを呼び出すすべてのメソッドに渡すか、インスタンス変数を宣言してメソッドで使用するかをどのように決定しますか?

クラスの最後のリストに保持されているインスタンス変数を好む傾向があります。しかし、私のプログラムがますます複雑になるにつれて、このリストはますます長くなります...何かが頻繁に渡されると、それを必要とするすべての男の子と女の子に見えるはずですが、私は疑問に思い始めます、 <!> quot;なぜすべてを公開しないのか!そうすれば、何も渡す必要がなくなります!<!> quot;

役に立ちましたか?

解決

インスタンス変数を参照しているので、オブジェクト指向言語で作業していると想定しています。ある程度、インスタンス変数を使用する場合、そのスコープを定義する方法、およびローカル変数を使用する場合は主観的ですが、クラスを作成するときはいつでも従うことができるいくつかの経験則があります。

  • インスタンス変数は通常、クラスの属性と見なされます。これらは、クラスから作成されるオブジェクトの形容詞と考えてください。インスタンスデータを使用してオブジェクトの説明に役立てることができる場合は、おそらくインスタンスデータに適した選択肢であることに間違いはありません。

  • ローカル変数は、メソッドのスコープ内で使用され、作業の完了を支援します。通常、メソッドには、データを取得し、データを返し、処理する目的が必要です。 /一部のデータでアルゴリズムを実行します。場合によっては、ローカル変数を、メソッドが最初から最後まで取得できるようにする方法と考えると役立ちます。

  • インスタンス変数のスコープは、セキュリティだけでなく、カプセル化のためでもあります。 <!> quot;目標がすべての変数をプライベートに保つことであると想定しないでください。< !> quot;継承の場合、通常、変数を保護されたものとして作成するのが適切な選択肢です。すべてのインスタンスデータをパブリックとしてマークするのではなく、外の世界にアクセスする必要があるもののゲッター/セッターを作成します。それらすべてを利用可能にしないでください-必要なもののみ。これは、開発ライフサイクル全体を通じて行われます-始めから推測するのは困難です。

クラスの周りにデータを渡すことになると、コードを見ずに何をしているのが良い習慣であると言うのは難しいです。インスタンスデータを直接操作するのが適切な場合もあります。それ以外の場合はそうではありません。私の意見では、これは経験によってもたらされるものです。オブジェクト指向の思考スキルが向上するにつれて、直感を身に付けることができます。

他のヒント

これは主に、変数に保存するデータの寿命に依存します。データが計算中にのみ使用される場合は、パラメーターとして渡します。 データがオブジェクトのライフタイムにバインドされている場合、インスタンス変数を使用します。

変数のリストが長くなりすぎる場合は、クラスの一部を新しいクラスにリファクタリングすることを検討するのがよいでしょう。

私の意見では、インスタンス変数は、データが呼び出し間で使用される場合にのみ必要です。

例を次に示します。

myCircle = myDrawing.drawCircle(center, radius);

myDrawingクラスのイメージングでは、15個のヘルパー関数を使用してmyCircleオブジェクトを作成できます。これらの各関数には、中心と半径が必要です。これらは、myDrawingクラスのインスタンス変数として設定しないでください。それらは二度と必要とされないからです。

一方、myCircleクラスは、中心と半径の両方をインスタンス変数として保存する必要があります。

myCircle.move(newCenter);
myCircle.resize(newRadius);

myCircleオブジェクトがこれらの新しい呼び出しが行われたときの半径と中心が何であるかを知るには、それらを必要とする関数に渡すだけでなく、インスタンス変数として保存する必要があります。

したがって、基本的に、インスタンス変数は<!> quot; state <!> quot;を保存する方法です。オブジェクトの。オブジェクトの状態を知るために変数が必要でない場合、インスタンス変数であってはなりません。

そしてすべてを公開することに関して。現時点であなたの人生が楽になるかもしれません。しかし、それはあなたを悩ませるために戻ってきます。しないでください。

私見:

変数がインスタンスの状態の一部を形成する場合、インスタンス変数-classinstance HAS-A instancevariableである必要があります。

インスタンスのメソッドに何かを繰り返し渡すことに気付いた場合、または何かを見逃したり、どこかでひどい抽象化を行った場合に、おそらくデザインを見てみると、インスタンス変数が多数あることがわかりました。

希望する

もちろん、クラス内に1つの大きなパブリック変数のリストを保持するのは簡単です。しかし、直感的にさえ、これは進むべき道ではないと言うことができます。

各変数を使用する直前に定義します。変数が特定のメソッドの機能をサポートしている場合は、メソッドのスコープ内でのみ使用してください。

セキュリティについても考えてください。パブリッククラス変数は、<!> quot; outside <!> quot;からの不要な変更の影響を受けやすくなっています。コード。あなたの主な目標は、すべての変数をプライベートに保つことであり、そうでない変数にはそうする非常に良い理由があるべきです。

パラメータをすべてスタックに渡すことについて、これは非常に高速になります。経験則では、メソッドシグネチャをクリーンでエレガントに保つことです。同じデータを使用する多くのメソッドが表示される場合は、クラスメンバになるほど重要かどうかを判断し、重要でない場合は、コードをリファクタリングしてより意味のあるものにします。

それは常識に要約します。それぞれの新しい変数を宣言する場所と理由、その機能を正確に考え、そこからどのスコープに入れるべきかを決定します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top