Es gibt eine Reihe von Fragen, die in Interviews und Klassen häufig verwendet werden, wenn es um objektorientiertes Design und Analyse geht. Dies ist einer von ihnen; Leider hat mein OOP-Professor am College nie eine Antwort darauf gegeben, und deshalb habe ich mich gefragt.
Das Problem ist wie folgt: Entwerfen Sie einen grundlegenden Satz von Objekten / Methoden, die zur Simulation einer Aufzugsbank verwendet werden. Was sind die Objekte und ihre Attribute / Methoden?
Nehmen wir aus Gründen der Argumentation an, dass unser Gebäude zwanzig Stockwerke hat. Die untere Etage ist die Lobby, und die zweite Etage ist mit dem Parkhaus verbunden (daher betreten / verlassen Personen das Gebäude entweder in der unteren Etage oder in der zweiten Etage). Es gibt eine Aufzugsbank, die alle Stockwerke bedient. In der Aufzugsbank befinden sich drei Aufzugsschächte und ein Aufzug pro Schacht.
Was wäre der richtige Weg, um dies in einem objektorientierten Modell zu modellieren?
quelle
Antworten:
Zuerst gibt es eine Aufzugsklasse. Es hat eine Richtung (oben, unten, Stand, Wartung), eine aktuelle Etage und eine Liste von Etagenanforderungen, die in der Richtung sortiert sind. Es erhält eine Anfrage von diesem Aufzug.
Dann gibt es eine Bank. Es enthält die Aufzüge und empfängt die Anfragen von den Etagen. Diese sind für alle aktiven Aufzüge vorgesehen (nicht in Wartung).
Die Planung wird wie folgt sein:
Jeder Aufzug hat eine Reihe von Zuständen.
Es gibt zusätzliche Signale:
BEARBEITEN: Einige Aufzüge starten nicht am unteren / ersten Stock, insb. im Falle von Wolkenkratzern.
min_floor & max_floor sind zwei zusätzliche Attribute für Elevator.
quelle
Donald Knuths The Art of Computer Programming Vol.1 zeigt den Aufzug und die Datenstrukturen. Knuth präsentiert eine sehr gründliche Diskussion und ein Programm.
Knuth (1997) "Information Structures", Die Kunst der Computerprogrammierung Vol. 1 S. 302-308
quelle
Ich habe viele Varianten dieses Problems gesehen. Einer der Hauptunterschiede (der die Schwierigkeit bestimmt) besteht darin, ob es einen zentralisierten Versuch gibt, ein "intelligentes und effizientes System" zu haben, das einen Lastausgleich bietet (z. B. mehr müßige Aufzüge am Morgen in die Lobby schicken). Wenn dies der Fall ist, wird das Design ein ganzes Subsystem mit wirklich unterhaltsamem Design enthalten.
Ein vollständiges Design ist offensichtlich zu viel, um es hier zu präsentieren, und es gibt viele Alternativen. Die Breite ist auch nicht klar. In einem Interview werden sie versuchen herauszufinden, wie Sie denken würden. Dies sind jedoch einige der Dinge, die Sie benötigen würden:
Darstellung der zentralen Steuerung (vorausgesetzt, es gibt eine).
Darstellungen von Aufzügen
Darstellungen der Schnittstelleneinheiten des Aufzugs (diese können von Aufzug zu Aufzug unterschiedlich sein). Natürlich auch Ruftasten auf jeder Etage usw.
Darstellungen der Pfeile oder Indikatoren auf jeder Etage (fast eine "Ansicht" des Aufzugsmodells).
Darstellung eines Menschen und einer Ladung (kann wichtig sein, um maximale Lasten zu berücksichtigen)
Darstellung des Gebäudes (in einigen Fällen, da bestimmte Stockwerke zeitweise blockiert sein können usw.)
quelle
Sehen:
Verknüpfung
quelle
Detaillierte Antwort:
http://www.angelfire.com/trek/software/elevator.html
quelle
Dinge, die bei der Gestaltung des Aufzugssystems zu beachten sind,
Jeder Tastendruck führt zu einer Aufzugsanforderung, die bedient werden muss. Jede dieser Anforderungen wird an einem globalen Ort verfolgt
Die Anzahl der Aufzüge im Gebäude wird vom Benutzer festgelegt. Das Gebäude wird eine feste Anzahl von Etagen enthalten. Die Anzahl der Passagiere, die in den Aufzug passen, wird festgelegt. Die Passagiere werden gezählt, wenn sie den Aufzug in ihrer Zieletage verlassen. Die Zieletage wird unter Verwendung eines "zufälligen" Poisson-Intervalls bestimmt. Wenn alle Passagiere im Aufzug ihre Zieletagen erreicht haben, kehrt der Aufzug in die Lobby zurück, um weitere Passagiere abzuholen
quelle
Die Hauptsache, über die Sie sich Sorgen machen müssen, ist, wie Sie den Aufzug darüber informieren, dass er sich nach oben oder unten bewegen muss. und auch, wenn Sie eine zentralisierte Klasse haben, um dieses Verhalten zu steuern, und wie Sie das Steuerelement verteilen können.
Es scheint sehr einfach oder sehr kompliziert zu sein. Wenn wir uns nicht die Parallelität oder die Zeit nehmen, die ein Aufzug benötigt, um an einen Ort zu gelangen, scheint es einfach zu sein, da wir nur die Zustände des Aufzugs überprüfen müssen, z. B. ob er sich auf oder ab bewegt oder stillsteht. Aber wenn wir Elevator dazu bringen, Runnable zu implementieren, und ständig eine Warteschlange (linkedList) überprüfen und synchronisieren. Eine Controller-Klasse weist zu, welche Etage in die Warteschlange aufgenommen werden soll. Wenn die Warteschlange leer ist, wartet die Methode run () (queue.wait ()). Wenn diesem Aufzug eine Etage zugewiesen ist, ruft sie queue.notify () auf, um die Methode run () zu aktivieren, und run () ) ruft die Methode goToFloor (queue.pop ()) auf. Dies wird das Problem zu kompliziert machen. Ich habe versucht, es auf Papier zu schreiben, aber ich glaube nicht, dass es funktioniert. Es scheint, als müssten wir hier nicht wirklich das Problem der Parallelität oder des Timings berücksichtigen.
Irgendein Vorschlag?
quelle