The before code uses simple flags and conditions without clear states, which can lead to inconsistent behavior. The after code defines explicit states and transitions, making the elevator's behavior predictable and easier to test.
### Before: No state machine, simple conditional logic
class Elevator:
def __init__(self):
self.floor = 0
self.moving = False
self.direction = None
def press_button(self, target_floor):
if target_floor > self.floor:
self.direction = 'up'
self.moving = True
elif target_floor < self.floor:
self.direction = 'down'
self.moving = True
else:
self.moving = False
def arrive_floor(self, floor):
self.floor = floor
self.moving = False
self.direction = None
### After: Using state machine
from enum import Enum, auto
class State(Enum):
IDLE = auto()
MOVING_UP = auto()
MOVING_DOWN = auto()
DOOR_OPEN = auto()
class Elevator:
def __init__(self):
self.state = State.IDLE
self.floor = 0
def press_button(self, target_floor):
if self.state == State.IDLE:
if target_floor > self.floor:
self.state = State.MOVING_UP
elif target_floor < self.floor:
self.state = State.MOVING_DOWN
def arrive_floor(self, floor):
self.floor = floor
if self.state in (State.MOVING_UP, State.MOVING_DOWN):
self.state = State.DOOR_OPEN
def close_door(self):
if self.state == State.DOOR_OPEN:
self.state = State.IDLE