0

ステータスがたくさんあり、ステータスごとに機能を構築しています。ステータスに基づいて変更を元に戻す方法を見つけようとしています。もう少し明確に: 5 つのステータスがあるとします: START INSTALLED PROC COMPLETE UPLOADED

ステータス COMPLETE から UPLOADED に移行するには、PROC ステータスと INSTALLED を実行する必要があります。関数を呼び出すことができる単純なシステムを構築しようとしています。配列などで定義されている依存関係に応じて、実行する関数を認識します。

前提: 各ステータスは後方にのみ戻すことができます。上記の例の場合、UPLOADED は COMPLETE ステータスに移行できません。各ステータスは、それ自体に戻ることができます (ステータス UPLOADED と UPLOADED に戻ります)。

どうすればこれを実行できるか知っている人はいますか?もちろん、さらに多くのステータスが表示されます。50 個の if ステートメントを回避しようとしているだけです :/

4

2 に答える 2

0

可能なステータス パスを使用して DAG (有向非巡回グラフ) を作成します。次に、提供された開始点を使用してグラフをトラバースし、アクセスしているノードの値に基づいて関数を呼び出すことができます。

したがって、ノードに値があった場合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
}

タスクを DB に戻すと、非常に洗練されたものになります。単一の整数にステータス全体を含めることができます。また、ビット マスクを使用して、特定のステータスのすべてのジョブを簡単にクエリすることもできます。

余談です。PROC に到達したジョブを考えると、次のようになります。

00111

(これは実際には 7 です)

したがって、仕事を進めて元に戻すことは、次のビットをチェックするだけの問題です...その猫の皮をむく方法はたくさんあります。そうすると得られるのは、関数をビットに関連付ける簡単な手段、ステータスを格納するコンパクトな手段、および必要なステップを評価するのに役立つ大量の数学です。

于 2013-07-11T18:30:31.233 に答える