粒子/状态

一个相当简单但相当有限的有限状态机实现

0.1.0 2016-04-12 08:10 UTC

This package is auto-updated.

Last update: 2024-09-24 04:44:05 UTC


README

Particle\State 是一个非常小巧且简单的库,实现了有限状态机。您可以在需要考虑多个状态之间的转换时在应用程序中使用它(这可能比您想象的更常见!)。

为什么?

在 Packagist 中已经有 winzou/statemachineyohang/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 自动完成,便于开发)
  • 易于阅读(提高同行评审)