|
Standalone State Machines
[Previous]  [Next] 
|
![]() |
User Manual [Previous]  [Next] Standalone State MachinesState machines can be defined at the top level of a model. This feature allows the definition of reusable state machines, to simplify code, or to facilitate separation of concerns. The example below shows that the statemachine keyword is used to specify a standalone state machine. Such a state machine, by itself, must be syntactically correct, and error messages will be generated, enabling debugging. However, the state machine is not displayed as a diagram and will not result in any code generation unless it is incorporated in one or more classes. The as keyword is used to do incorporate a standalone state machine in a class, as shown in the example. An alternative, and equivalent, way to define state machines outside of classes is to use traits. A model equivalent to the example below is shown in Example 5 of the page on state machines in traits. Standalone state machines can be used to make code appear simpler than it does when the state machine is directly incorporated in a class or trait, as there is less indentation, and the statemachine keyword makes it more explicit that what is being described is a state machine. Standalone state machine used in two classes
// Class Diagram illustrating use of top-level state machine with
// usage in separate classes.
// Note that this could also be accomplished by putting the
// state machine in a trait, and then having each class use the trait
class MotorController {
motorStatus as deviceStatus;
}
class BrakeController {
brakeStatus as deviceStatus;
}
// By itself, the following will not generate any code
// but it can be debugged by itself outside of any class
// and can be incorporated in multiple classes, as above
statemachine deviceStatus {
inactive {
activate -> booting;
}
booting {
completedStartupChecks -> active;
startupCriticalErrorDetected -> outOfOrder;
}
active {
runtimeCriticalErrorDetected -> outOfOrder;
deactivate -> shuttingDown;
}
shuttingDown {
shutdownComplete -> inactive;
}
outOfOrder {
repaired -> inactive;
}
}
Load the above code into UmpleOnline Standalone state machine modified when reused
// Class Diagram illustrating standalone state machine being
// modified when it is reused, to add additional events
// states and entry/exit actions
class MotorController {
Boolean warmup = false;
motorStatus as deviceStatus {
// Add a transition to the reused state machine
cancel booting-> inactive;
completedStartupWhilewarning booting -> warm ;
// Add transition with action
warmSoReady inactive -> / {warmup=true;} booting ;
// Add an entirely new state
warm {
go -> active;
}
// add an entry action to an existing state
inactive {
entry / {warmup=false;};
}
};
}
// Reusable standalone state machine
statemachine deviceStatus {
inactive {
activate -> booting;
}
booting {
completedStartupChecks -> active;
startupCriticalErrorDetected -> outOfOrder;
}
active {
runtimeCriticalErrorDetected -> outOfOrder;
deactivate -> shuttingDown;
}
shuttingDown {
shutdownComplete -> inactive;
}
outOfOrder {
repaired -> inactive;
}
}
// @@@skipphpcompile - contains java code
// @@@skippythoncompile - Contains Java Code
Load the above code into UmpleOnline Syntax// State machine elements in Umple. See user manual page: BasicStateMachines stateMachineDefinition : statemachine [=queued]? [=pooled]? [name] { [[state]]* } referencedStateMachine : [name] as [definitionName]  ( { [[extendedStateMachine]] } | ;  ) //Issue 547 and 148 extendedStateMachine# :  ( [[comment]]  | [=changeType:+| - |- |*]? [[state]]  | [[standAloneTransition]]  )* |