McRui
McRui

Reputation: 1931

Running class methods in cascade

I have a system that was designed to do a kind of cascading - get the sequence of methods called upon success of the previous condition.

The example is the below code, which I presume it's not a best practice for doing this, so would be great if I could get some suggestions to refactor this, probably using a design pattern or a different than this system.

<?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();
?>

Upvotes: 0

Views: 161

Answers (1)

bitWorking
bitWorking

Reputation: 12665

I would avoid deep nesting of if/else statements to enhance the readability. One way is to use early return:

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;
    }
}

If you need it more dynamically you could use call_user_func or call_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;
    }
}

Upvotes: 2

Related Questions