0

私は、実用的な問題と理論上の同等物を接続/リンクしようとしてかなり疲れています。

私の問題を説明するために、非常に単純な例を選択します。

Worker クラスがあるとします。

class Worker {
private : // default access modifier 
     int workerId;
};

Table クラスがあるとします。

class Table {
private : // default access modifier 
    int tableId;
};

ResturantManager クラスがあるとします。

class ResturantMangager
private: // default access modifier
    list<Table*> allTables;
    list<Worker*> allWorkers;
public:
    // the function should tell the worker that he should call one of its function,
    // its decision to what table to put the client returned by its function 
    // must be somehow updated in the allTables (mark the table he chose to put the client
    // as unavailable).
    void putClientInTable(const Worker& worker, const Client& client);
};

ここで、ワーカーが利用可能なテーブルの 1 つにクライアントを配置できるようにしたいと考えています。その後、Resturant のクラス データ メンバー allTables がこのテーブルを (ID ルックアップによって) 利用不可としてマークするようにします。つまり、Worker はどのテーブルを選択するかを決定できる必要があり (または ResturantManager が彼に伝えます - 別の方法で実現できる方法がわかりません)、ResturantManager の allTables も更新する必要があります。

このアイデアに最も適したデザイン パターン ( http://sourcemaking.com/design_patterns ) を探しています。

この問題に適切な設計パターンはありますか?

皆さん、ありがとうございました。

4

3 に答える 3

3

このアイデアに適したデザインパターンがあり、それを使用できるかどうかはわかりません。ホイールを再発明するよりも常に優れていますか?

非常に好ましいアプローチ。しかし、あなたの質問に正しく答えるために、あなたは自分自身に「どんな考え」を自問するべきです。一般的な問題を解決するためのパターンが存在します。あなたの問題はレストランや労働者に関係しているので、特定のパターンを選択するのは面倒だと感じるかもしれません。

また、あらゆる状況で採用する「聖なる」デザインパターンのようなものはありません。レストランや車などのモデリングに適したデザインパターンはありません。モデルからこれらの詳細を抽象化し、解決しようとしている問題の本質を理解する必要があります。

クラス間でどのような関係を築こうとしていますか?これらの関連付けはどのようにナビゲートされますか?

プログラムは静的データベースではありません。プログラムはデータを処理します。データ構造は、アルゴリズムが実行するはずの処理の種類に最も適した方法で設計する必要があります。「普遍的に良い」デザインのようなものはめったにありません。誰かがあなたに彼のことを言ったら、疑いを持って彼の言うことを聞いてください。

あなたのプログラムは、特定の顧客がどのテーブルに座っているかを見つけることになっていますか?どの顧客がどのテーブルに座っているかを調べることになっていますか?どのウェイターがどの顧客にサービスを提供しているか、どのテーブルにサービスを提供しているか、または各ウェイターが1日に同じテーブルに何回サービスを提供しているかを確認する必要がありますか?

言い換えれば、あなたのプログラムの運用要件は何ですか?上記のルックアップを実行する可能性はどのくらいありますか?挿入はルックアップよりも頻繁に行われると予想されますか?そして、顧客の名前またはテーブルのIDによるルックアップは、レポートを印刷するためのテーブル/ウェイター/顧客のセット全体に対する単なる反復よりも頻繁ですか?

何に適しているかを明確にしないと、適切なデザインを見つけることができません。要約すると、2つのことを行う必要があります。

  1. プログラムの運用要件を特定します(または少なくとも合理的な仮定を立てようとします)。
  2. 抽象的な用語で推論することによって適切なデザインパターンを選択します。つまり、アプリケーションドメインに固有の詳細を削除します。
于 2013-01-28T12:37:02.803 に答える
1

私がこれを見ているように、あなたはいつでもすべてのテーブルのステータスについて最新の状態に保ちたいですか?

1つの設計アイデアは、親クラスまたはメインクラス(この例では、レストランマネージャークラスのTable * allTables)でグローバルデータセットを維持することです。-作業する引数の1つとしてTable*のポインターを受け取るworkerクラスに関数を記述します。-メインクラスのデータセットへのポインタを使用してこの関数を呼び出します。

それが役に立てば幸い。

于 2013-01-28T12:35:33.503 に答える
1

カップラの考え。

  • レストランのマネージャーは、テーブルが含まれているため、おそらくレストランである可能性があります。マネージャにはテーブルが含まれていません。:-)

  • ワーカーとテーブルはコンテナに保管する必要があります。STL には多くの機能があります。

  • 関数 PutClientInTable は、Table クラスのメンバーである可能性があります。そうすれば、テーブルを「見る」ことでテーブルが占有されているかどうかを知ることができます (Table クラスに「GetIsOccupied()」を追加した場合)。

  • レストランは、ワーカーが呼び出すパブリック関数「GetNextAvailableTable」を提供できます。

于 2013-01-28T12:47:54.500 に答える