0

TV モニターにいくつかのチャートを表示するプログラムがあり、これらのチャートは 30 秒ごとに循環します。

表示されるチャートごとにグローバル オブジェクトを使用しています (そのため、オブジェクトには棒、面、折れ線シリーズ、およびメソッドが含まれます)。グローバルにする理由は、最初の SQL クエリが実行された後 (毎日午前 7 時に) グラフのデータが変更されないためです。1 日を通して 20 の異なるチャートを循環する必要があるだけです。

このシナリオでローカル オブジェクトを使用するのは無駄ですか? 新しいチャートに切り替えるたびに、プログラムは新しいオブジェクトを作成し、異なるシリーズに常に同じデータポイントを入力する必要があります。

このシナリオでグローバル オブジェクトを使用しないようにするにはどうすればよいですか? 私が尋ねている理由は、プログラムでグローバル オブジェクトを遠ざける必要があることを読んだからです。

4

2 に答える 2

1

グローバル/ローカルオブジェクト-実際にはカプセル化の問題(およびスコープの問題-オブジェクトはアプリケーショングローバルまたはクラスグローバルにすることができます-ベストプラクティスは、オブジェクトを必要な場所にできるだけ近く、スコープごとに初期化して割り当てることです-スコープは次のようになりますアプリケーション(実際には名前空間)、クラス、メソッド、さらにはブロック(using{}やforeach{}など)。多くのアプリケーショングローバルメンバーを作成する代わりに、それらをクラスにカプセル化してそれらのクラスを初期化する必要があります。メインループと第二に、クラスのすべての利点があります-サブクラス化、多態性など。必要な限り、これらのクラスへの参照を保持します。あなたの場合、私が知る限り、データが変更されるまでそれらを保持します。それは24時間になりますか?

いずれにせよ、ある時点で、メインアプリケーションオブジェクトからデータにアクセスできる必要があります。データオブジェクトを適切にカプセル化した場合、つまり、表示する必要のあるすべての情報を保持するクラスを作成した場合でも、メインアプリケーションループでそれらのクラスを初期化する必要があります。

30秒ごとにオブジェクトを再作成する必要はないと思います。クラスメンバーにデータを入力すると、もちろん変更または破棄する場合を除いて、変更されません。また、実際にコンピュータのメモリを大量に消費しているため、何らかの方法でメモリに保存する必要のあるデータから数秒または場合によっては数分後に再作成するために表示された後、各グラフを実際に破棄する必要があるとは思えません。

アプリがどのように機能するかを理解する方法では、基本グラフクラスを作成し、グラフと同じ数のグラフサブクラスを作成します(オブジェクトデザインが互いに異なる場合は、クラスで作成し、場合によってはリストに入れます)。 ()、午前7時に各グラフに入力し、コレクションをループして表示します。

于 2013-03-10T20:48:30.007 に答える
0

大規模なプロジェクトでは、一般にシステムの柔軟性に影響するため、グローバル オブジェクトの使用は避ける必要があります。

たとえば、ビジネス オブジェクトが結果を 24 時間キャッシュする場合、最新の結果を取得するプログラムの他の部分がキャッシュされた値を取得するか、書き直す必要があることを意味します。

この問題は、クラス メンバーではなくインスタンス メンバーを使用することで回避できます。例えば

public class ResultsCache
{
  public IEnumerable<Visitors> TotalVisitors {get; }
  public IEnumerable<Purchases> TotalPurchases {get; }
  public IEnumerable<Refunds> TotalRefunds {get; }

  public void FetchData() {
     //...
  }
}

var cache24hours = new ResultsCache();
var currentView = new RefundsView(cache24hours);
于 2013-03-10T22:07:39.297 に答える