0

我有一个函数,基本上,它执行以下操作:
启动变量->while循环->将结果存储在数据库中。
但是,由于我项目的各个部分都使用了这个函数,我不得不为每一步添加回调函数,给自己一些灵活性。

我当前的实现如下所示:

function doStuff(arg1, arg2, $callbacks = array())
{
    //Init vars
    $var1 = ...
    $var2 = ...

    $callbacks['onStart']();//callback..

    //Loop:
    while(....)
    {

       $callbacks['afterCycle']; //callback after each loop.
    }

    //Database storage.
    $this->store($data);

    $callbacks['onEnd'](); //callback...

    }  

但是我目前对该函数的实现并不令人满意,我认为维护代码并不容易,如果我想创建另一个类似的函数(init->loop->storage),我会重复自己,而我的代码会不一致,例如当前的循环后回调函数称为“afterCycle”,但对于另一个函数,它可以称为“afterLoop”,这会使我的代码不一致,更难理解。

我目前对此的想法是创建一个类,将这些回调函数存储在预定义的公共字段中,因此名称是不可更改的,并且该函数doStuff将强制传递该回调类的对象。我还不确定这个新实现是否有任何好处,这就是我在这里问的原因。

我想到的新实现如下所示:

function doStuff(arg1, arg2, Callback $callbacks)
{
    //Init vars
    $var1 = ...
    $var2 = ...

    $callbacks->onStart();//callback..

    //Loop:
    while(....)
    {

       $callbacks->afterCycle(); //callback after each loop.
    }

    //Database storage.
    $this->store($data);

   $callbacks->onEnd(); //callback...

    }  
4

1 回答 1

1

你可以使用一个界面

interface ICallBack {
    public function onStart();
    public function afterCycle();
    public function onEnd();
}

//So all the methods in ICallBack must be implemented within CallBack
class CallBack implements ICallBack {
    public function onStart() {
        //blah
    }       

    ...
}


function doStuff(arg1, arg2, ICallback $callback){
   //Init vars
   $var1 = ...
   $var2 = ...

   $callback->onStart();//callback..

   ....
}
于 2013-06-11T22:43:05.427 回答