web-dev-qa-db-ja.com

オブジェクト指向の分析と設計を使用したエレベーターのモデリング

オブジェクト指向の設計と分析に関しては、インタビューや授業でよく使用されると思われる一連の質問があります。これはそのうちの1つです。残念ながら、大学の私のOOP教授は実際にそれに答えたことはなかったので、不思議に思っていました。

問題は次のとおりです。エレベータバンクをシミュレートするために使用されるオブジェクト/メソッドの基本セットを設計します。オブジェクトとその属性/メソッドとは何ですか?

議論のために、建物が20階建てであると仮定しましょう。最下階はロビーで、2階は駐車場につながっています(したがって、人々は最下階または2階のいずれかで建物に出入りします)。すべてのフロアにサービスを提供するエレベーターバンクが1つあります。エレベータバンクには3つのエレベータシャフトがあり、シャフトごとに1つのエレベータがあります。

これをオブジェクト指向モデルでモデル化する正しい方法は何でしょうか?

133
Keith B

まず、エレベータークラスがあります。方向(上、下、スタンド、メンテナンス)、現在のフロア、および方向でソートされたフロアリクエストのリストがあります。このエレベーターからリクエストを受け取ります。

それから銀行があります。エレベータが含まれており、フロアからリクエストを受け取ります。これらは、アクティブなすべてのエレベータにスケジュールされます(メンテナンス中ではありません)。

スケジューリングは次のようになります。

  • 可能であれば、この階の立ちエレベーターを選びます。
  • それ以外の場合は、この階に移動するエレベーターを選びます。
  • それ以外の場合は、他の階の立ちエレベーターを選択します。
  • それ以外の場合は、負荷が最小のエレベーターを選択します。

各エレベーターには一連の状態があります。

  • メンテナンス:エレベータは外部信号に反応しません(自身の信号にのみ反応します)。
  • スタンド:エレベーターは床に固定されています。着信を受けた場合。そして、エレベーターがその階にあり、ドアが開きます。別のフロアにある場合、その方向に移動します。
  • 上:エレベーターが上に移動します。床に到達するたびに、停止する必要があるかどうかを確認します。その場合、ドアを停止して開きます。一定時間待機し、ドアを閉じます(何かが移動している場合を除きます。その後、リクエストリストからフロアを削除し、別のリクエストがあるかどうかを確認します。状態スタンド。
  • 下:上と似ていますが、逆方向です。

追加の信号があります:

  • 警報。エレベーターが停止します。そして、それが床にある場合、ドアが開き、要求リストがクリアされ、要求は銀行に戻りました。
  • ドアが開いています。エレベーターが床にあり、動かない場合にドアを開きます。
  • ドアが閉まります。開いている場合はドアを閉めました。

編集:一部のエレベーターは、bottom/first_floorから開始しません。高層ビルの場合。

min_floorおよびmax_floorは、Elevatorの2つの追加属性です。

162
Toon Krijthe

Donald KnuthのThe Art of Computer Programming Vol.1には、エレベーターとデータ構造のデモンストレーションがあります。 Knuthは非常に徹底した議論とプログラムを提示します。

Knuth(1997) "Information Structures"、The Art of Computer ProgrammingVol。 1 pp.302-308

18
vine'th

この問題の多くの変種を見てきました。主な違い(難易度を決定する)の1つは、負荷分散(たとえば、午前中にロビーにもっと多くのアイドルエレベーターを送信する)を行う「スマートで効率的なシステム」を持つための集中的な試みがあるかどうかです。その場合、デザインには、本当に楽しいデザインのサブシステム全体が含まれます。

完全なデザインは、ここで提示するには明らかに多すぎるため、多くの代替案があります。幅も明確ではありません。インタビューで、彼らはあなたがどう思うかを理解しようとします。ただし、これらは必要なものの一部です。

  1. セントラルコントローラーの表現(存在すると仮定)。

  2. エレベーターの表現

  3. エレベータのインターフェイスユニットの表現(これらはエレベータごとに異なる場合があります)。もちろん、すべてのフロアなどでボタンを呼び出します。

  4. 各階の矢印またはインジケータの表示(エレベータモデルのほぼ「ビュー」)。

  5. 人間と貨物の表現(最大負荷を考慮するために重要な場合があります)

  6. 建物の表現(場合によっては、特定のフロアが時々ブロックされるなど)

17
Uri

見る:

Lu Luo, A UML Documentation for a Elevator System
Distributed Embedded Systems, Fall 2000
Ph.D. Project Report
Carneghie Mellon University

リンク

7
Arun
4
some_other_guy

心配する主なことは、エレベータに上下に移動する必要があることをどのように通知するかです。また、この動作を制御するための集中型クラスを作成する場合、およびコントロールをどのように配布できるかについても説明します。

非常に単純または非常に複雑になる可能性があるようです。並行性やエレベータが1つの場所に到達する時間をとらない場合、エレベータの状態を確認するだけでよいので、エレベータが上下に移動したり、静止したりするなど、簡単に思えます。しかし、ElevatorにRunnableを実装させ、キュー(linkedList)を常にチェックおよび同期する場合。 Controllerクラスは、キューに入れるフロアを割り当てます。キューが空の場合、run()メソッドは待機し(queue.wait())、このエレベータにフロアが割り当てられると、queue.notify()を呼び出してrun()メソッドを起動し、run( )メソッドはgoToFloor(queue.pop())を呼び出します。これにより、問題が複雑になりすぎます。私はそれを紙に書き込もうとしたが、うまくいくとは思わない。ここでは同時実行性やタイミングの問題を実際に考慮する必要はないようですが、何らかの方法でキューを使用してコントロールを配布する必要があります。

なにか提案を?

2
user3216886

考慮すべき点 設計 エレベーターシステム、

Elevator
Floor/Location Identifier
Number of steps
Rotation speed
Daterange
InstallationDate
MaintainenceDate
Department Identifier
AllowedWeight
Detail / Description
Poison Ratio (Statistics)
Start
Stop
SetDirection
SetRotationSpeed
EmergencyStop = Stop + Alert
EmergencyAccidentSenser Handler

ボタンを押すたびに、エレベータのリクエストが送信されます。これらの各リクエストはグローバルな場所で追跡されます

建物内のエレベーターの数は、ユーザーが決定します。建物には一定数のフロアが含まれます。エレベーターに収まる乗客の数は固定されます。乗客は、目的階のエレベーターを出るときにカウントされます。行き先階は、「ランダムな」ポアソン間隔を使用して決定されます。エレベーター内のすべての乗客が目的階に到着すると、エレベーターはロビーに戻り、より多くの乗客を迎えます

2
user2603625