オブジェクト指向の設計と分析に関しては、インタビューや授業でよく使用されると思われる一連の質問があります。これはそのうちの1つです。残念ながら、大学の私のOOP教授は実際にそれに答えたことはなかったので、不思議に思っていました。
問題は次のとおりです。エレベータバンクをシミュレートするために使用されるオブジェクト/メソッドの基本セットを設計します。オブジェクトとその属性/メソッドとは何ですか?
議論のために、建物が20階建てであると仮定しましょう。最下階はロビーで、2階は駐車場につながっています(したがって、人々は最下階または2階のいずれかで建物に出入りします)。すべてのフロアにサービスを提供するエレベーターバンクが1つあります。エレベータバンクには3つのエレベータシャフトがあり、シャフトごとに1つのエレベータがあります。
これをオブジェクト指向モデルでモデル化する正しい方法は何でしょうか?
まず、エレベータークラスがあります。方向(上、下、スタンド、メンテナンス)、現在のフロア、および方向でソートされたフロアリクエストのリストがあります。このエレベーターからリクエストを受け取ります。
それから銀行があります。エレベータが含まれており、フロアからリクエストを受け取ります。これらは、アクティブなすべてのエレベータにスケジュールされます(メンテナンス中ではありません)。
スケジューリングは次のようになります。
各エレベーターには一連の状態があります。
追加の信号があります:
編集:一部のエレベーターは、bottom/first_floorから開始しません。高層ビルの場合。
min_floorおよびmax_floorは、Elevatorの2つの追加属性です。
Donald KnuthのThe Art of Computer Programming Vol.1には、エレベーターとデータ構造のデモンストレーションがあります。 Knuthは非常に徹底した議論とプログラムを提示します。
Knuth(1997) "Information Structures"、The Art of Computer ProgrammingVol。 1 pp.302-308
この問題の多くの変種を見てきました。主な違い(難易度を決定する)の1つは、負荷分散(たとえば、午前中にロビーにもっと多くのアイドルエレベーターを送信する)を行う「スマートで効率的なシステム」を持つための集中的な試みがあるかどうかです。その場合、デザインには、本当に楽しいデザインのサブシステム全体が含まれます。
完全なデザインは、ここで提示するには明らかに多すぎるため、多くの代替案があります。幅も明確ではありません。インタビューで、彼らはあなたがどう思うかを理解しようとします。ただし、これらは必要なものの一部です。
セントラルコントローラーの表現(存在すると仮定)。
エレベーターの表現
エレベータのインターフェイスユニットの表現(これらはエレベータごとに異なる場合があります)。もちろん、すべてのフロアなどでボタンを呼び出します。
各階の矢印またはインジケータの表示(エレベータモデルのほぼ「ビュー」)。
人間と貨物の表現(最大負荷を考慮するために重要な場合があります)
建物の表現(場合によっては、特定のフロアが時々ブロックされるなど)
見る:
Lu Luo, A UML Documentation for a Elevator System
Distributed Embedded Systems, Fall 2000
Ph.D. Project Report
Carneghie Mellon University
心配する主なことは、エレベータに上下に移動する必要があることをどのように通知するかです。また、この動作を制御するための集中型クラスを作成する場合、およびコントロールをどのように配布できるかについても説明します。
非常に単純または非常に複雑になる可能性があるようです。並行性やエレベータが1つの場所に到達する時間をとらない場合、エレベータの状態を確認するだけでよいので、エレベータが上下に移動したり、静止したりするなど、簡単に思えます。しかし、ElevatorにRunnableを実装させ、キュー(linkedList)を常にチェックおよび同期する場合。 Controllerクラスは、キューに入れるフロアを割り当てます。キューが空の場合、run()メソッドは待機し(queue.wait())、このエレベータにフロアが割り当てられると、queue.notify()を呼び出してrun()メソッドを起動し、run( )メソッドはgoToFloor(queue.pop())を呼び出します。これにより、問題が複雑になりすぎます。私はそれを紙に書き込もうとしたが、うまくいくとは思わない。ここでは同時実行性やタイミングの問題を実際に考慮する必要はないようですが、何らかの方法でキューを使用してコントロールを配布する必要があります。
なにか提案を?
考慮すべき点 設計 エレベーターシステム、
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
ボタンを押すたびに、エレベータのリクエストが送信されます。これらの各リクエストはグローバルな場所で追跡されます
建物内のエレベーターの数は、ユーザーが決定します。建物には一定数のフロアが含まれます。エレベーターに収まる乗客の数は固定されます。乗客は、目的階のエレベーターを出るときにカウントされます。行き先階は、「ランダムな」ポアソン間隔を使用して決定されます。エレベーター内のすべての乗客が目的階に到着すると、エレベーターはロビーに戻り、より多くの乗客を迎えます