0

我有很多状态,我正在为每个状态构建功能。我试图弄清楚如何根据状态恢复更改。更清楚一点:假设您有 5 个状态:START INSTALLED PROC COMPLETE UPLOADED

为了从状态 COMPLETE 变为 UPLOADED,我必须运行 PROC status 和 INSTALLED。我正在尝试构建一个简单的系统,我可以在其中调用一个函数,它会根据它们在数组或其他东西中定义的依赖关系知道要运行哪些函数。

假设:每个状态只能向后恢复。所以如果在上面的例子中,UPLOADED 不能进入 COMPLETE 状态。每个状态都可以恢复为自身(状态已上传并恢复为已上传)。

有人知道我该怎么做吗?当然会有更多的状态,我只是想避免 50 个 if 语句:/

4

2 回答 2

0

使用可能的状态路径创建 DAG(有向无环图)。然后,您可以使用提供的起点遍历图形,并根据您正在访问的节点的值调用函数。

因此,如果您的节点具有 value complete,我假设您要调用该complete(...)函数。所以你可以做这样的事情:

call_user_func($nodeValue, ...);
于 2013-07-11T18:15:12.860 回答
0

我会把它包装成一个简单的旧整数。这样想:

class Foo {
    const START     = 1; // 2^0
    const INSTALLED = 2; // 2^1
    const PROC      = 4; // 2^2
    const COMPLETE  = 8; // 2^3
    const UPLOADED  = 16;// 2^4

    // all powers of 2
}

如果你在数据库中支持你的任务,它也会非常优雅,一个整数可以包含整个状态。您还可以使用位掩码非常轻松地快速查询具有给定状态的所有作业。

我跑题了。如果你想到了 PROC 的工作,它会是这样的:

00111

(实际上是7)

因此,将工作向前推进和回滚,只是检查下一点的问题……无数种剥那只猫的方法。那么你得到的是一种将函数与位相关联的简单方法,一种存储状态的紧凑方法,以及大量数学来帮助你评估所需的步骤。

于 2013-07-11T18:30:31.233 回答