粒子 / 状态
一个相当简单但相当有限的有限状态机实现
0.1.0
2016-04-12 08:10 UTC
Requires
- php: >=5.4
- league/event: ^2.1
Requires (Dev)
- phpunit/phpunit: ~4.0
- squizlabs/php_codesniffer: 2.*
This package is auto-updated.
Last update: 2024-09-24 04:44:05 UTC
README
Particle\State 是一个非常小巧且简单的库,实现了有限状态机。您可以在需要考虑多个状态之间的转换时在应用程序中使用它(这可能比您想象的更常见!)。
为什么?
在 Packagist 中已经有 winzou/statemachine 和 yohang/finite 时,为什么还要选择另一个实现相同概念的包?
首先,与它们相比,Particle\State 非常小巧,几乎什么都不做。这意味着它所做的一切都很容易理解,无需阅读大量代码。此外,由于它只做一件事情,因此很容易学习如何使用这个库。
除此之外,我们希望有一个不会引起干扰的库:您可以在不必须以某种方式对对象进行建模的情况下实现 Particle\State。实际上,Particle\State 没有任何需要您实现的接口。
尽管如此,请查看它们。也许它们更适合您。
小型使用示例
$initialState = State::withName('pending'); $machine = StateMachine::withStates($initialState, StateCollection::withStates([ State::withName('pending'), State::withName('started'), State::withName('accepted'), State::withName('rejected'), State::withName('completed'), State::withName('failed'), ])); $machine->addTransition(Transition::withStates('start', ['pending'], 'started')); $machine->addTransition(Transition::withStates('accept', ['started'], 'accepted')); $machine->addListener(function (Event\TransitionApplied $event) { if ($event->wasFromState(State:withName('pending')) { echo "The state was pending. Not anymore though :)"; } }); var_dump($machine->canApplyTransition('accept')); // bool(false), because not in 'started' state; var_dump($machine->canApplyTransition('start')); // bool(true); var_dump($machine->transition('start')); // bool(true); var_dump($machine->canApplyTransition('accept')); // bool(true); var_dump($machine->canApplyTransition('start')); // bool(false);
功能特性
- 验证状态转换是否可行;
- 将状态转换到下一个状态;
- 将事件监听器作为转换回调挂钩到状态更改。
非功能特性
- 易于编写(IDE 自动完成,便于开发)
- 易于阅读(提高同行评审)