101

メソッドに引数を渡すか、オブジェクトのすべてのメソッドに表示されるオブジェクトインスタンス変数として引数を宣言するかをどのように決定しますか?

クラスの最後にあるリストにインスタンス変数を保持することを好みますが、プログラムが大きくなるにつれて、このリストは長くなります。変数が十分な頻度で渡されるかどうかは、それを必要とするすべてのメソッドに表示されるはずですが、「すべてが公開されていれば、何も渡す必要はありません」と思います。

4

5 に答える 5

60

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

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

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

  • インスタンス変数のスコープは、セキュリティだけでなく、カプセル化にも使用できます。「目標はすべての変数を非公開にすることである」と思い込まないでください。継承の場合、通常、変数を保護された状態にするのが良い代替手段です。すべてのインスタンスデータをパブリックとしてマークするのではなく、外部にアクセスする必要があるもののためにゲッター/セッターを作成します。それらをすべて利用可能にしないでください-必要なものだけを使用してください。これは開発ライフサイクル全体で発生します。最初から推測するのは困難です。

クラスを介してデータを渡すことになると、コードを見ずに自分がしていることが良い習慣であると言うのは難しいです。インスタンスデータを直接操作しても問題ない場合があります。それ以外の場合はそうではありません。私の意見では、これは経験に伴うものです。オブジェクト指向の思考スキルが向上するにつれて、直感が発達します。

于 2008-12-06T10:45:27.220 に答える
48

これは主に、変数に格納するデータの有効期間によって異なります。データが計算中にのみ使用される場合は、パラメーターとして渡します。データがオブジェクトの存続期間にバインドされている場合は、インスタンス変数を使用します。

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

于 2008-12-06T10:39:51.193 に答える
24

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

次に例を示します。

myCircle = myDrawing.drawCircle(center, radius);

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

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

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

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

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

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

于 2008-12-06T10:47:12.427 に答える
4

私見では:

変数がインスタンスの状態の一部を形成する場合、それはインスタンス変数である必要があります-classinstanceHAS-インスタンス変数。

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

それが役に立てば幸い

于 2008-12-06T10:40:35.637 に答える
3

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

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

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

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

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

于 2008-12-06T10:39:52.940 に答える