0

サーバーとアプリケーションの 2 つのクラスがあり、多対多の関係があります。サーバーは複数のアプリケーションを実行でき、アプリケーションは複数のサーバーで実行できます。3 番目のクラスである Host は、単一のサーバー上の単一のアプリケーションを表します。これには、Application および Server オブジェクトへの参照と、サーバー上のアプリケーションによって使用されるディスク容量などの追加データが含まれます。サーバー オブジェクトとアプリケーション オブジェクトの両方に、すべてのホストのリストが含まれます。したがって、アプリケーションはホストを認識し、ホストはアプリケーションを認識し、サーバーはホストを認識し、ホストはサーバーを認識します。

私のプロジェクトの目的は、一連のアプリケーションを新しいサーバーに移行するスケジュールを立てることです。当初、各アプリケーションには移行開始日と移行終了日がありました。一部のアプリケーションには、仮想化の開始日と終了日もあります。仮想化は、アプリケーションの制約内で移行を実行できない場合に発生します (これらが何であるかは気にしないでください)。これは移行の前に行われ、アプリケーションをその制約から解放します。「スケジュール」と呼ばれるオブジェクトは、アプリケーション オブジェクトによって保持されます。これには、これら 4 つの日付、仮想化するかどうかを示すブール値フラグ、および移行に必要な工数を含む「月」のリストが含まれます (または仮想化)各特定の月のアプリケーション。

指定された日に、サーバーを個別に仮想化できるようにしたいと考えています。これらのサーバー上のすべてのアプリケーション (またはアプリケーションの一部、つまりホスト) は、この日に仮想化されます。アプリケーションの残りの部分と一緒に移行されます。最初は、サーバー クラスに独自の Schedule オブジェクトを保持させることにしました。次に、仮想化の日付がサーバーに設定されました。ただし、サーバーとアプリケーションのスケジュールの一貫性を保つことにしました。たとえば、サーバー スケジュールの移行の開始日と終了日を、そのサーバーで実行されているすべてのアプリケーションの最も早い開始日と最も遅い終了日にそれぞれ設定する必要があります。サーバ。つまり、アプリケーションの日付を更新するたびに、すべてのサーバーの日付を (ホスト オブジェクトを介して) 更新することを覚えておく必要がありました。または、アプリケーションを更新したい場合'

次に、各 Host オブジェクト内に 1 つの Schedule オブジェクトを配置することを考えました。これにより、一貫性の問題は解決されますが、かなりの冗長性が生じます。アプリケーションに属するすべてのホスト オブジェクトの移行日は必ず同じになるため (ただし、仮想化の日付は異なる可能性があります)、アプリの移行日を設定すると、すべてのホストに同じ日付を設定します。また、上記のように、サーバーとアプリケーションの最早開始日と最遅終了日を計算する必要がある場合もいくつかあります。これには、次のいずれかが含まれます: アプリケーションとサーバー オブジェクトのそれぞれにこのデータを保持する (事実上、それぞれに独自のスケジュールを与えることで、一貫性を保って問題を元に戻す)、または: 必要になるたびに、ループによってこのデータをオンザフライで計算するすべてのホストのスケジュールを通じて。毎月のアプリケーションに必要な工数についても同じことが言えます。これはアプリケーション レベルで計算され、1 か月あたりの各ホストの時間に分割され、アプリケーション レベルで再度計算する必要があるときに再計算されます。ご想像のとおり、これは少しも効率的ではありません。

これは簡単な質問ではありませんが、この種の状況に対処するための受け入れられた戦略があるかどうか疑問に思っています. 私の投稿の冗長性について事前に申し訳ありません。うまくいけば、私は状況を十分に明確にしました。

4

2 に答える 2

1

第 3 段落以降に入ると、これは複雑です。

次の設計原則を使用します

  1. Keep Application、Server、Host オブジェクトには、最低限必要な動作と状態が含まれています。

たとえば、アプリケーション オブジェクトには、開始日、終了日、および仮想化の開始日と仮想化の終了日が含まれる場合があります。サーバーのリストを含める必要があるかどうか考えてみてください。またはホストのインスタンス?

  1. 次に、このような小さなフレームワークについて考えます。

    a) リストを使用して移行の完全なプロセスを実行する MigrationManager

b) MigrationContext は、移行プロセスの情報を合成します。

c) ErrorContext はエラーと例外処理を合成します

Migration Manager は Scheduler のインスタンスを取得し、移行をスケジュールします

このようにして、コア ビジネス オブジェクトとビジネス ロジックを中心に、フレームワークのようなものを徐々に進化させることができます。

覚えておくべき重要なこと

  1. 関心事の分離。
  2. コードの再利用性: たとえば、Application オブジェクトは、移行プロセス全体を拘束する必要がない場合があります。代わりに、これらのことは別のオブジェクトで行うことができます

(この回答は、私の高レベルの理解と間違っている可能性がある仮定に基づいています。しかし、要件を満たすアプリケーションを構築するためのいくつかの指示が得られると思います)

もう一度提案があります。StarUML や ArgoUML などのモデリング ツールを使用して、アイデアを絵の形にします。これにより、すべてのメンバーが非常に迅速に質問に入ることができます。

ありがとう

于 2012-09-18T10:52:38.813 に答える
0

オブジェクト指向プログラミングの基本原則は、可能な限り、状態のすべての変更可能な側面には、明確に定義された所有者が常に 1 人だけ必要であるということだと思います (その所有者は、別の 1 つのエンティティによって所有される可能性があります。他の 1 つのエンティティによって順番が変わるなど)。他のオブジェクトやエンティティはその変更可能な状態への参照を保持する場合がありますが、そのような参照は所有者の観点から考える必要があります。たとえば、メソッドがコレクションへの参照を受け入れ、それを設定することになっている場合、そのメソッドは、所有するコレクションを操作するという観点ではなく、他の誰かが所有するコレクションを操作するという観点から考えます。そのエンティティの利益。

さまざまなオブジェクトが、同じ可変状態であると想定されるものの個別のコピーを持つ必要がある場合があります。この状況は、オブジェクトがオブジェクトの回転角度を「所有」している可能性があるグラフィカル ユーザー インターフェイスなどで頻繁に発生しますが、表示コントロールはそのオブジェクトの現在の向きでのプライベート レンダリングをキャッシュする必要がある場合があります。このようなケースの処理は、1 つのオブジェクトが絶対マスターに指定され、他のオブジェクトにその状態を通知し続ける場合に大幅に簡素化される場合があります。複数のオブジェクトがあり、いずれも排他的な所有権を持っていない場合、それは非常に複雑になりますが、それらすべてが相互に同期を維持することになっています。

状態の一部を複製する必要がないようにモデルを操作できる場合は、そうすることを強くお勧めします。ただし、同じ状態にあるはずの 2 つのものがそうではない可能性を含め、関心のあるすべてのシナリオをモデルで表現できることが重要です。最も重要なことは、状態のすべての側面に明確に定義された所有権の連鎖があることです。これにより、状態の側面が変更されたときに、誰の状態が影響を受けるかを知ることができます。

于 2013-01-20T22:05:55.650 に答える