我有很多状态,我正在为每个状态构建函数。我正试图弄清楚如何根据状态恢复更改。更清楚一点:假设您有5种状态:启动已安装PROC完成上传
为了从状态COMPLETE变为UPLOADED,我必须运行PROC状态和INSTALLED。我正在尝试构建一个简单的系统,在这个系统中我可以调用一个函数,它会知道哪些函数需要运行,这取决于它们在数组中定义的依赖关系。
假设:每个状态只能向后恢复。因此,如果在上面的例子中,UPLOADED不能进入COMPLETE状态。每个状态都可以恢复为其自身(状态UPLOADED和恢复为UPLOADED)。
有人知道我该怎么做吗?当然会有更多的状态,我只是想避免50 if语句:/
使用您可能的状态路径创建一个DAG(有向无循环图)。然后,您可以使用提供的起点遍历图,并根据所访问节点的值调用函数。
因此,如果您的节点具有值complete
,我假设您想要调用complete(...)
函数。所以你可以这样做:
call_user_func($nodeValue, ...);
我会把它包装成一个简单的旧整数。这样想:
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)
所以,向前和向后移动工作岗位,只是检查下一点的问题。。。有很多方法可以剥那只猫的皮。然后,你得到的是一种将函数与位相关联的简单方法,一种存储状态的紧凑方法,以及帮助你评估所需步骤的大量数学计算。