Data Modeling Patterns
State Transitions
A transition function makes the rules for moving between model states easy to test.
State Transitions
state_transitions.go
package main
import "fmt"
const (
OrderNew = iota
OrderPaid
OrderShipped
)
func nextState(current int, paid bool) int {
if current == OrderNew && paid {
return OrderPaid
}
if current == OrderPaid {
return OrderShipped
}
return current
}
func main() {
var paid =
current := OrderNew
next := nextState(current, paid)
done := next == OrderShipped
fmt.Println("paid=", paid)
fmt.Println("current=", current)
fmt.Println("next=", next)
fmt.Println("done=", done)
}
package main
import "fmt"
const (
OrderNew = iota
OrderPaid
OrderShipped
)
func nextState(current int, paid bool) int {
if current == OrderNew && paid {
return OrderPaid
}
if current == OrderPaid {
return OrderShipped
}
return current
}
func main() {
var paid =
current := OrderNew
next := nextState(current, paid)
done := next == OrderShipped
fmt.Println("paid=", paid)
fmt.Println("current=", current)
fmt.Println("next=", next)
fmt.Println("done=", done)
}
transition function
Keep state changes in one helper so each branch explains when the model can advance.