8

同じ変数のインスタンスを必要とする複数のクラスを処理するときに、1つの中心的なクラスを作成することは、優れたプログラミング手法ですか?

chatWindow.variables.username = userField.getText();

例えば:

  1. 変数の量が設定されたクラスがあります
  2. 同じ変数を必要とする別のクラスがあります
  3. そして、最初のものと同じ変数を必要とする別のもの

だから私はすべて同じ変数のインスタンスを使用する3つのクラスを持っています

最初のクラスを使用して変数クラスインスタンスを作成するだけです(1)

これらの変数には、クラス(2)、(3)からクラス(1)を使用してアクセスします。

例:(classTwo()にいる間):

classOne.variableClass.VariableName = false;

編集:基本的な形式では、私の質問は、中央の「変数クラス」を作成し、他のクラスを使用してメインクラスを介して同じインスタンスにアクセスしてもよいかどうかです。

私の質問は理解しにくいことは知っていますが、別のもっと簡単な方法があると確信しています。最初のクラスの同じインスタンスを2番目と3番目のクラスのコンストラクターに渡してみましたが、私のソリューションはいくらか単純に見えました。

4

5 に答える 5

5

これは機能の羨望のようなにおいがします...それを行うとき、モデルに何か問題があるように聞こえます。

複数のクラスで変更する必要のある変数のグループがある場合、それはおそらくオブジェクト(おそらくエンティティ)になるはずです。ただし、他のクラスでこれらの値を変更する必要がある場合は、同じクラスにロジックを配置する必要がある可能性があることを考慮する必要があります(検証チェックなどを行うため)。

変数を保持するためだけに追加のクラスがあると、通常、貧血ドメインと呼ばれるコードの臭いと見なされます。しかし、それを必要とする場合があり、とにかくそれは好みの問題かもしれません。その場合、あなたのクラスは栄光の構造体に他なりません。

于 2012-09-07T08:14:26.680 に答える
4

クラスに必要なものを見つけさせるのではなく、依存性注入を使用して必要なすべてのリソースを渡すことをお勧めします。

グローバル変数の使用は最初は簡単ですが、アプリケーションが成長し、単体テストを使用したい場合、これらの管理と保守がより困難になるため、これらは非常に困難です。

于 2012-09-07T08:08:00.257 に答える
1

クラスを適切に分離したようには思えません。クラスが他のクラス変数を変更することは問題ありませんが、可変変数を格納する場所を1つにすることは避けたいと思います。これにより、管理が非常に難しく、回避するのが最善のグローバル変数のように見えます。詳細については、こちらをご覧ください。プログラムの結合度を緩く保つのに役立つDementerの法則も調べてください。

于 2012-09-07T08:07:12.797 に答える
1

すべての問題には独自の最善の妥協点があります。一連の質問を自問する必要があります。(2)と(3)は、(1)へのアクセスのみを準備する必要がありますか、それとも書き込みアクセスも必要ですか?

実際に行っていること((1)から(2)と(3)を作成するのは良いようです、ビルダーパターン、直接アクセスすることのないインスタンスを作成します)

書き込みアクセスが必要な場合は、(2)(3)(またはその逆)によって行われた変更を通知する必要がありますか?

一般に、「サブクラス」からの可能な限りの相互作用を制限する必要があります(もちろん、可能であれば、共有されないようにするのが理想的ですが、一般的にはそうです)。したがって、(1)内からそれらにアクセスすることもより良い解決策のようです。 (2)と(3)から(1)にアクセスします。

この種の制限により、コードの保守性が向上し、値の変更通知、誰が誰を所有するかなどの問題が削除/削減されます。

基本的に、ユーザーが(1)についてのみ心配する必要があり、他のすべてのものが内部で処理される場合、あなたはすでに良い仕事をしています(Pimplイディオムはあなたに何も言いませんか?)

(1)の拡張のように(2)と(3)を作成することもできるので、戦略パターンとまったく同じように動作します。(1)インスタンスについてのみ心配する必要があるという利点がありますが、将来さらに拡張する必要がある場合は、(1)すでに戦略を実行する準備ができており、最小限の労力で更新できます。(私は常に、あなたが書くことができるすべてのコードに複数のパターンが常に存在することに気づきます)。

結局、すべてのコードの詳細を知っているのはあなただけです。コードの保守性、読みやすさなど、可能な場合はアップグレードが必要な場合など、改善できるかどうかを常に自問してください。

于 2012-09-07T08:23:14.400 に答える
0

例がないため、何が必要かはよくわかりませんが、レジストリパターンが必要なのかもしれません。

基本的に、アプリケーション全体で必要なすべての変数を保持する1つの静的「グローバル」クラスを作成します

public abstract final class VarRegistry {
    public static final String var1 = "val1";
    public static final int var2 = 2;
}

これで、これらの変数にアクセスする必要があるすべてのクラスで、それらに簡単にアクセスして変更できます。

VarRegistry.var1 = "test";

これをコーディングする前に、少し待ってください。このような「グローバル」変数を使用することはあまりお勧めできません。これらの変数がいつどのように誰によって変更されるかがわからないため、データのカプセル化が破損します。

依存性注入など、データを適切に有効化するより安全なパターンをサポートするようにプログラムを再構築することをお勧めします。

于 2012-09-07T08:07:52.640 に答える