[oop] 객체 지향 분석 및 설계를 사용하여 엘리베이터 모델링 [닫기]

객체 지향 디자인 및 분석과 관련하여 인터뷰 및 수업에서 일반적으로 사용되는 것으로 보이는 일련의 질문이 있습니다. 이것은 그들 중 하나입니다. 불행히도 대학의 OOP 교수는 실제로 그것에 대한 대답을 한 적이 없으므로 궁금합니다.

문제는 다음과 같습니다. 엘리베이터 뱅크를 시뮬레이션하는 데 사용할 기본 객체 / 방법 세트를 설계합니다. 객체와 그 속성 / 방법은 무엇입니까?

논쟁을 위해 우리 건물의 바닥이 20 층이라고 가정하자. 1 층은 로비이며 2 층은 주차장과 연결되어 있습니다 (따라서 사람들은 1 층 또는 2 층에 건물을 출입 할 것입니다). 모든 층에 서비스를 제공하는 엘리베이터 뱅크가 하나 있습니다. 엘리베이터 뱅크에는 3 개의 엘리베이터 샤프트가 있고 샤프트 당 하나의 엘리베이터가 있습니다.

객체 지향 모델에서 이것을 모델링하는 올바른 방법은 무엇입니까?



답변

먼저 엘리베이터 클래스가 있습니다. 방향 (위, 아래, 스탠드, 유지 보수), 현재 층 및 방향으로 정렬 된 층 요청 목록이 있습니다. 이 엘리베이터로부터 요청을받습니다.

그런 다음 은행이 있습니다. 엘리베이터가 있으며 바닥에서 요청을받습니다. 이들은 모든 활성 엘리베이터로 예정되어 있습니다 (유지 보수 아님).

일정은 다음과 같습니다.

  • 가능하면이 층에 서있는 엘리베이터를 선택하십시오.
  • 그렇지 않으면이 층으로 이동하는 엘리베이터를 선택하십시오.
  • 그렇지 않으면 다른 층에 서있는 엘리베이터를 선택하십시오.
  • 그렇지 않으면 가장 낮은 부하로 엘리베이터를 선택하십시오.

각 엘리베이터에는 상태 세트가 있습니다.

  • 유지 보수 : 엘리베이터는 외부 신호 (자신의 신호에만)에 반응하지 않습니다.
  • 스탠드 : 엘리베이터는 바닥에 고정되어 있습니다. 전화를받는 경우 엘리베이터가 저 층에 있고 문이 열립니다. 다른 층에 있으면 그 방향으로 움직입니다.
  • 위로 : 엘리베이터가 올라갑니다. 바닥에 도달 할 때마다 중지해야하는지 확인합니다. 그렇다면 문을 멈추고 엽니 다. 일정 시간 동안 기다렸다가 문을 닫습니다. 국가 대.
  • 아래로 : 위와 같지만 반대 방향으로.

추가 신호가 있습니다 :

  • 경보. 엘리베이터가 멈 춥니 다. 그리고 바닥에 있으면 문이 열리고 요청 목록이 지워지고 요청이 은행으로 다시 이동됩니다.
  • 문 열림. 엘리베이터가 바닥에 있고 움직이지 않으면 문을 엽니 다.
  • 문이 닫힙니다. 문이 열려 있으면 닫힙니다.

편집 : 일부 엘리베이터는 bottom / first_floor esp에서 시작하지 않습니다. 고층 빌딩의 경우.

min_floor 및 max_floor는 엘리베이터에 대한 두 가지 추가 속성입니다.


답변

Donald Knuth의 The Art of Computer Programming Vol.1에는 엘리베이터와 데이터 구조에 대한 데모가 있습니다. Knuth는 매우 철저한 토론과 프로그램을 제공합니다.

Knuth (1997) “정보 구조”, 컴퓨터 프로그래밍 Vol. 1 pp.302-308


답변

이 문제의 많은 변형을 보았습니다. 주요한 차이점 (난이도 결정) 중 하나는로드 밸런싱이 가능한 “스마트하고 효율적인 시스템”을 갖추려는 중앙 집중식 시도가 있는지 여부입니다 (예 : 아침에 더 많은 유휴 엘리베이터를 로비로 보내기). 이 경우 디자인에는 정말 재미있는 디자인의 전체 하위 시스템이 포함됩니다.

완전한 디자인은 여기에 제시하기에는 너무 많으며 다른 대안이 있습니다. 폭도 명확하지 않습니다. 인터뷰에서 그들은 당신의 생각을 알아 내려고 노력할 것입니다. 그러나 다음은 필요한 것 중 일부입니다.

  1. 중앙 컨트롤러를 나타냅니다 (있는 경우).

  2. 엘리베이터의 표현

  3. 엘리베이터의 인터페이스 장치 표현 (엘리베이터마다 다를 수 있음). 물론 모든 층의 버튼도 호출하십시오.

  4. 각 층의 화살표 또는 표시기 표시 (엘리베이터 모델의 “보기”).

  5. 사람과화물의 표현 (최대 하중을 고려할 때 중요 할 수 있음)

  6. 건물 대표 (일부 경우, 때때로 특정 층이 막힐 수 있기 때문에)


답변

보다:

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

링크


답변


답변

엘리베이터 시스템을 설계 할 때 고려해야 할 사항 ,

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

각 버튼을 누를 때마다 엘리베이터 요청이 제공됩니다. 이러한 각 요청은 전 세계 장소에서 추적됩니다.

건물의 엘리베이터 수는 사용자가 결정합니다. 건물에는 정해진 수의 층이 있습니다. 엘리베이터에 탑승 할 수있는 승객 수는 고정됩니다. 승객은 목적지 층에서 엘리베이터를 떠날 때 계산됩니다. 목적지 층은 “랜덤”포아송 간격을 사용하여 결정됩니다. 엘리베이터의 모든 승객이 목적지 층에 도달하면 엘리베이터는 더 많은 승객을 픽업하기 위해 로비로 돌아갑니다


답변

가장 걱정해야 할 것은 엘리베이터에 엘리베이터를 올리거나 내릴 필요가 있다는 것을 어떻게 알리는 것입니다. 또한이 동작을 제어하기위한 중앙 집중식 클래스를 사용하고 컨트롤을 배포하는 방법도 있습니다.

매우 간단하거나 복잡 할 수 있습니다. 동시성이나 엘리베이터가 한 장소에 도달하는 데 시간이 걸리지 않으면 엘리베이터의 상태를 확인해야하기 때문에 엘리베이터가 위 또는 아래로 움직이거나 서있는 것처럼 간단합니다. 그러나 Elevator가 Runnable을 구현하고 큐 (linkedList)를 지속적으로 확인하고 동기화하면. 컨트롤러 클래스는 대기열에 갈 층을 지정합니다. 대기열이 비어 있으면 run () 메서드는 대기 (queue.wait ())를하고,이 엘리베이터에 바닥이 할당되면 queue.notify ()를 호출하여 run () 메서드를 깨우고 run ( ) 메소드는 goToFloor (queue.pop ())를 호출합니다. 이렇게하면 문제가 너무 복잡해집니다. 나는 종이에 그것을 쓰려고 노력했지만 그것이 효과가 있다고 생각하지 않습니다. 여기서 동시성 또는 타이밍 문제를 고려할 필요가없는 것 같습니다.

어떠한 제안?