我有很多状态,我正在为每个状态构建功能。我试图找出如何根据状态恢复更改。更明确一点: 假设你有5个状态: 开始 INSTALLED PROC 完成 UPLOADED
为了从状态COMPLETE转到UPLOADED,我必须运行PROC状态并安装。我正在尝试构建一个简单的系统,我可以在其中调用一个函数,它将知道运行哪些函数,具体取决于它们在数组中定义的依赖关系。
假设: 每个状态只能向后还原。因此,如果在上面的示例中,UPLOADED无法进入COMPLETE状态。 每个状态都可以恢复为自身状态(Status UPLOADED并恢复为UPLOADED)。
任何人都知道我怎么能这样做?当然会有更多的状态,我只是想避免50个if语句:/
答案 0 :(得分:0)
使用您可能的状态路径创建DAG(定向非循环图)。然后,您可以使用提供的起点遍历图形,并根据您正在访问的节点的值调用函数。
因此,如果您的节点具有值complete
,我假设您要调用complete(...)
函数。所以你可以这样做:
call_user_func($nodeValue, ...);
答案 1 :(得分: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)
因此,将工作向前推进并回滚,只是一个问题,即检查下一点...大量的方法来修皮猫。你得到的是一种简单的方法,可以将功能与位相关联,一种紧凑的存储状态方法,以及大量的数学运算来帮助您评估所需的步骤。