1

オブジェクト指向プログラミングで静的フィールドとメソッドをいつ使用するか使用しないかについて多くの質問があることは知っていますが、ほとんどの例は、Math.Pi または同様の単​​純化された例を使用することに要約されます。

私はプログラマーとしての重大な機能を失っており、OOP プログラミング全般に準拠することができないことが原因だと思います。私なら、自分のプログラムの多くに関数型アプローチを使用しますが、仲間のプログラマーは必ずしも同意しません。

すべての問題が OOP コンテキストで最適に解決されるわけではないことは理解していますが、現在直面している問題のうち、OOP 手法で最もよく解決されると思われる問題を提示しようと思います。

私の主な問題は、C# で OOP を使用するときにシステム リソースを最大限に活用する方法を理解していないことです。クラスに静的フィールドとメソッドを導入するときのメモリ割り当てと実行の流れ、およびリソースを静的または非静的として宣言するタイミングを視覚化できません。

だから、これは私の問題の簡単な説明です:

切断された 2 つのシステム間で情報を同期する「ユーティリティ」を開発する必要があります。「システム 1」は、顧客から報告され、テスターに​​よって検証されたバグに関する情報を含む「チケット」で動作します。.Net の Entity Framework を介して SQL データベースへの Linq クエリを介して、オブジェクトとしてチケットの内容にアクセスできます。

「システム 2」は、「システム 1」のチケットに基づいて作成する必要があるワークアイテムで動作します。「ユーティリティ」はこの情報を同期しておく必要があり、両方のシステムから変更される可能性があります。そのため、さまざまなオブジェクトの状態に関する情報をプログラムの実行間で保持する必要があります。

そこで、「システム 1」のデータベース (読み取り専用) を使用して、「システム 2」の最初の作業項目を作成するための要件に一致するローカル オブジェクトを作成し、バイナリ シリアル化によってローカル オブジェクトを保存します。次に実行して値をローカルで比較し、不要なネットワークとサーバーの負荷を回避してから、それぞれの API を介してシステムを更新します。

これを行うための実用的な解決策がありますが、それが効率的に実行されるかどうかはわかりません。実行間の状態を保持するために使用されるクラス (LocalTicket) とクラス (LocalWorkItem) がありますが、LocalTicket クラスはデータベース接続を使用してチケットに関する情報を収集し、静的リストを宣言してサーバーからの値を保持しますローカル オブジェクトと比較します。最初の LocalTicket オブジェクトのコンストラクターに入る前にリストを初期化せず、LINQ to Object クエリを介して初期化します。

これにより、LocalTicket が作成されるたびに LINQ クエリが実行されますか、それとも 1 回だけ実行されますか? クラスの静的メソッドを介して LINQ クエリから List を初期化するか、非静的メソッドで List にオブジェクトを設定し、ユーティリティ クラスでメソッドを呼び出して新しいオブジェクトを作成することを要求する方がよいでしょうか。オブジェクトを比較するには?または、定義時に直接初期化しますか? クエリのコンテンツから作成された結果の LocalTickets はローカルで使用され、ヘルプ デスク アプリケーションを介してデータベースに加えられた実際の変更を検出するために、実行ごとに新しく作成されます。

これがゴミの山のように思えたら申し訳ありませんが、もっと説明的な方法で説明する方法がわかりません...

ファクトリなど、オブジェクトを生成する外部ソースへの呼び出しを含むクラスを設計するためのガイダンスが必要だと思います。

これを文脈で読んだとき、誰かが実際に私にアドバイスを与えることができるかどうか驚いていますが、私はチャンスをつかみます...

4

1 に答える 1

0

各リモートサーバーを管理する「サービス」クラスを作成し、そこにあるメソッドを介してチケットまたはワークアイテムのリストを保持およびクエリします。

チケットや作業項目のリストを常に永続的なものにしたくはありません。アプリケーションは、これらの一部を時々更新する必要があります。

そう:

  • チケットサービス。
  • ワークリスト サービス。

優れたプログラミング形式では、これらのサービスは静的ではなく、メイン プログラムでグローバル変数として所有される方がよいでしょう。

メインのワークループは次のもので構成できます。

this.ticketService = new TicketService( /*some DB location*/);
this.worklistService = new WorklistService( /*worklist DB or URL location*/);
while (stillRunning) {
    List<Ticket> tickets = ticketService.queryTickets();
    syncTickets( tickets);
    // wait 1 minute.
}

お役に立てれば。

于 2013-05-04T10:27:24.703 に答える