在级联中运行类方法

时间:2014-06-10 17:08:07

标签: php oop design-patterns

我有一个设计用于执行某种级联的系统 - 获取前一个条件成功时调用的方法序列。

示例是下面的代码,我认为它不是这样做的最佳实践,所以如果我能得到一些重构的建议,可能会使用设计模式或不同于此系统

<?php
class Model
{
    public function isOk()
    {
        return true;
    }
}

class OtherClass
{
    public function isOk()
    {
        return true;
    }
}

class AnotherClass
{
    public function verifies()
    {
        return true;
    }
}

class Sequence
{
    public function fire()
    {

        $model = new Model();
        if($model->isOk()) {

            $otherclass = new OtherClass();
            if($otherclass->isOk()) {

                $anotherclass = new AnotherClass();
                if($anotherclass->verifies()) {

                    echo "We're done with the sequence.";

                    return true;

                } else {
                    return false;
                }

            } else {
                return false;
            }
        } else {
            return false;
        }

    }
}

$sequence = new Sequence();
echo $sequence->fire();
?>

1 个答案:

答案 0 :(得分:2)

我会避免if / else语句的深度嵌套以增强可读性。一种方法是使用早期回报:

class Test1
{
    public function isOk()
    {
        echo 'Test1';
        return true;
    }
}

class Test2
{
    public function isOk()
    {
        echo 'Test2';
        return true;
    }
}

class Sequence
{
    public function fire()
    {
        $test1 = new Test1();
        if (!$test1->isOk()) {
            return false;
        }

        $test2 = new Test2();
        if (!$test2->isOk()) {
            return false;
        }

        echo "We're done with the sequence.";
        return true;
    }
}

如果您需要更加动态,可以使用call_user_funccall_user_func_array

class Sequence
{

    protected $sequence = array(
        array('Test1', 'isOk'),
        array('Test2', 'isOk'),
    );

    public function fire()
    {
        foreach ($this->sequence as $callback) {
            if (!call_user_func(array(new $callback[0], $callback[1]))) {
                return false;
            }
        }
        echo "We're done with the sequence.";
        return true;
    }
}