私は、ASP.NET フロント エンド サイトで構成される非常に単純なアプリケーションを使用しており、WCF Windows サービスが重労働のバックエンド ロジックを実行しています。
ユーザーには、いくつかのパラメーターを選択して「送信」ボタンを押す単純なページが 1 つあります。ページは WCF サービスを呼び出し、パラメーターを渡します。サービスは「Job」クラスのインスタンスをインスタンス化し、パラメーターをコンストラクターに送信してから、すべての作業を行う「Run()」メソッドを呼び出します - 「ジョブ」レコードをユーザー名、時間とともにデータベースに挿入します開始など... サード パーティ ベンダーにリクエストを送信し、データを取得してデータベースに格納し、他のビジネス ロジックを実行してから、ジョブを完了としてマークします。
次に、ユーザーは自分の仕事を検索できる 2 番目の単純なページ (日付でソートされ、その仕事に関連する複数のフィールドを表示する検索可能なコンボ ボックス) を表示し、その仕事に対応するデータを画面に表示できます。パネルにラベルとして表示されるジョブ テーブルのフィールド (開始時間、完了時間、ステータスなど) と、サード パーティ ベンダーから取得した実際のデータ (パネルの下にグリッドとしてレンダリング)。
さて、私の質問に移りましょう。上記のすべてのフィールドと、パブリックな Run() メソッドおよびコンストラクターを持つ Job クラスがあります。いくつかの単純なプライベート関数と、IParser、IVendorConnection、IDataAccess などのクラスへのインターフェイスであるいくつかのプライベート メンバーがあります。これらのクラスは、上記で説明したすべての実際の作業を行います。実際の Job クラスと Run() メソッドはあまり機能しません。実際の作業では、作業をその複合オブジェクトに委譲するだけです (とりわけ、優れたテスト容易性を実現します)。
現在、この Job クラスには 3 つの異なる用途 / 状態があります。その主な用途はサービス内で、Run() 関数を使用して文字通りジョブを実行することです。また、他にも 2 つの用途があります。上で説明したパネルのモデルとして機能し、上で説明したコンボ ボックスのモデルとして機能します。ジョブ クラスには 3 つのパブリック コンストラクターがあり、それぞれが 3 つの状態のいずれかに設定します。すべての場合において、それぞれの異なる「状態」は、他の 2 つの状態が気にしない特定のメンバーのみを気にします。場合によっては、一部のメンバーが 3 つの状態すべてで使用されます。「コンボ ボックスの状態」が最も単純です。この場合、必要な読み取り専用フィールドは 3 つだけです。「パネル状態」では、6 つの読み取り専用フィールドを気にします。「作業」状態では、基本的に、ジョブの進行に合わせてこれらのフィールド値を作成します。これらはすべて非公開にする必要があります。
これを行うためのよりクリーンな方法を探しています。状態 A で Job クラスをインスタンス化すると、メンバー X へのアクセスが機能しないか、関数 Y の呼び出しが失敗することがわかっています。ただし、それはまだコンパイル可能なコードです。
他の人が以前にこの問題に直面したことがあると確信しています。MustInherit/abstract としてマークされた基本 Job クラスを作成し、各状態に 1 つずつ、3 つの派生クラスを作成することを考えていました。共有メンバーをベースに配置し、状態固有のメンバーを派生に配置し、必要に応じてコードで派生クラスを使用するだけです。これは私の目的には十分に単純で、私の問題を解決します。おそらく、ある種の JobFactory を持つこともできます...おそらく私は箱の外で十分に考えていないので、他の人がこれをどのように解決したかを探しているだけだと思います...私は以前に多くのクラスをステートマシンにしました趣味でゲームを開発していた時代 - しかし、それらのクラスのインスタンスは状態を変更する可能性があるため (たとえば、「敵」クラスの状態が「attack_mode」から「待機中」に変更される可能性があるため)、それは異なります。変化する状態はありません。一度作成されると、ジョブはその状態を維持する必要があり、別の状態で動作しようとしないでください。特定の状態にないときにメソッド/メンバーが使用された場合に状態を追跡し、例外をスローすることは、脆弱で多すぎるように見えます。以前にこの問題をどのように解決したかに基づいた提案はありますか? そして、私がやろうとしていることはやり過ぎですか?ジョブがますます異なる状態になり始めた場合、私はそうは思わないでしょう-しかし、おそらくそれが多くの異なる状態を取得した場合は、とにかく異なるクラスに分割することを考える必要があります...あなたの2セントを探してください. 以前にこの問題をどのように解決したかに基づいた提案はありますか? そして、私がやろうとしていることはやり過ぎですか?ジョブがますます異なる状態になり始めた場合、私はそうは思わないでしょう-しかし、おそらくそれが多くの異なる状態を取得した場合は、とにかく異なるクラスに分割することを考える必要があります...あなたの2セントを探してください. 以前にこの問題をどのように解決したかに基づいた提案はありますか? そして、私がやろうとしていることはやり過ぎですか?ジョブがますます異なる状態になり始めた場合、私はそうは思わないでしょう-しかし、おそらくそれが多くの異なる状態を取得した場合は、とにかく異なるクラスに分割することを考える必要があります...あなたの2セントを探してください.