2012-07-14 7 views
5

最近、私はインスタンス変数がグローバル変数と同じ問題を抱えていると感じています。私はこれについて調べて、this old articleが多かれ少なかれ私が見ている潜在的な問題を説明していることが分かりました。インスタンス変数は新しいグローバル変数ですか?

グローバル変数の同じ問題がインスタンス変数やクラス変数に影響しないようにするために、どのような良い方法を使用しますか?

答えて

2

クラスはグローバル構造よりはるかに小さいので、インスタンス変数の影響はずっと小さくなります。小規模のクラスサイズを維持し、単一の責任原則に厳密に従うことによって、グローバル変数の欠点の多くが回避されます。インスタンス変数が渡されたパラメータから作成された場合は、コンストラクタでそのパラメータを必須にして、依存関係を明示的にします。また、インスタンス変数はカプセル化されており、インスタンスのメソッドの外部で直接変更されることはありません。インスタンス変数がどこで変更されたかを簡単に判断できます。最後に、インスタンス変数はクラス全体に意味を持たせるか、プライベートでなければなりません。

0

インスタンス変数は、特定のクラス内でのみアクセスできます。したがって、インスタンス変数があまりにも広く使用されないようにするには、クラスを小さくします。クラスが大きくなる場合、元のクラスが使用する別の小さなクラスにリファクタリングできる部分があるかどうかを判断します。

0

norインスタンス変数もグローバル変数も変数も "問題"があります。これらはすべてツールです。問題は、多くのプログラマが「間違ったツール」を使用することを選択することがあることです。あなたの選択が意味することを慎重に考えなければならないので、正しい選択をすることができます。

CurrentUserNameのようなグローバル変数を使用すると、CurrentUserNameは普遍的に知っていると言っていることを意味します。そして、 "それぞれ1つのCurrentUserNameしか存在できない"ということです。あなたが本当に幸運なことがなく、両方のユーザーが同じ名前を持っていない限り、ユーザーが同時にログに記録できるようにしたい場合は、おそらく間違いでしょう...

インスタンス変数で正しく使われていませんユーザーの電子メールアドレスをインスタンス変数にして、各ユーザーが複数の電子メールアドレスを持つことができるということです。 継承に関する関連する問題は、たとえば、典型的な生徒、教師の問題をモデル化していて、生徒を作成しようとする場合です。 PersonのサブクラスとTeacherはPersonのサブクラスです。次に、いくつかの人が両方であるかもしれないことを理解しています。

生徒は、実行時に変更できない静的な関係です。学生と教師は静的な関係ではありません...人はどちらでもないことができますし、生徒になろうとしてから教師になってから両方を止めても、常に同じ人になります。そのモデルはそれを扱うことができません....

ユーザーは、複数の電子メールアカウントに "関連"しています...インスタンス変数を配置すると、あなたの問題のドメインと矛盾しているので、あなたが問題を抱えているのです。...

世界的に知られている現在のユーザー名だけがあると言えば同じことが言えます。 ..

すべての場合の問題は、t帽子に問題のあるドメインがあり、それを間違ってモデリングしている...あなたのプログラムとモデルを問題ドメインと同様に動作させる必要があります....もしあなたがそれをしなければ、あなたが問題を解決するために選択したツール。

私はまた、電子メールアドレスのリストを持つユーザーは間違っていると思いますが、これはまったく異なる動機のセットです。私は実際に...

オブジェクトだけで、他のオブジェクトを「知っている」...それは実装決定です...

class ContactInformation 
{ 
    User contact; 
    EMailAddress email; 
} 

を使用して、オブジェクトが「持っている」他のオブジェクトを「所有」もしていないことを覚えているだろう

関連する問題