(PHP) Рефакторинг if - else условий
От: MasterMind Россия  
Дата: 16.05.15 12:59
Оценка:
Каким образом можно сделать меньше следующий код?


if ($a == 1) {

 $obj = new Class1();

} else if ($a == 2) {

 $obj = new Class2();

} else if ($a == 3) {

 $obj = new Class3();

} else if ($a == 4) {

 $obj = new Class4();

}

....


То есть имеется примерно 100 значений переменной $a, от значения которой каждый раз вызывается свой определенный класс.
Re: (PHP) Рефакторинг if - else условий
От: evilbloodydemon  
Дата: 16.05.15 15:15
Оценка:
Здравствуйте, MasterMind, Вы писали:


MM>То есть имеется примерно 100 значений переменной $a, от значения которой каждый раз вызывается свой определенный класс.


$class = "Class$a";
$obj = new $class();
... << RSDN@Home 1.2.0 alpha 5 rev. 67>>
Re[2]: (PHP) Рефакторинг if - else условий
От: MasterMind Россия  
Дата: 16.05.15 16:00
Оценка:
Здравствуйте, evilbloodydemon, Вы писали:

E>Здравствуйте, MasterMind, Вы писали:



MM>>То есть имеется примерно 100 значений переменной $a, от значения которой каждый раз вызывается свой определенный класс.


E>
E>$class = "Class$a";
E>$obj = new $class();
E>


Название класса не имеет в себе каких то повторяющихся наименований.
Re: (PHP) Рефакторинг if - else условий
От: Submitter  
Дата: 16.05.15 16:13
Оценка:
Здравствуйте, MasterMind, Вы писали:

MM>Каким образом можно сделать меньше следующий код?


switch () {
case: ... break;
}
Re: (PHP) Рефакторинг if - else условий
От: deadem Россия  
Дата: 16.05.15 16:56
Оценка: 4 (1)
Здравствуйте, MasterMind, Вы писали:

MM>
MM>if ($a == 1) {
MM> $obj = new Class1();
MM>} else if ($a == 2) {
MM> $obj = new Class2();
MM>


MM>То есть имеется примерно 100 значений переменной $a, от значения которой каждый раз вызывается свой определенный класс.


$cls = [
  1 => "Class1",
  2 => "Class2"
];
$obj = new $cls[$a]();
Re[3]: (PHP) Рефакторинг if - else условий
От: evilbloodydemon  
Дата: 16.05.15 16:59
Оценка: 4 (1)
Здравствуйте, MasterMind, Вы писали:

MM>Название класса не имеет в себе каких то повторяющихся наименований.


ну тогда так:

$classMap = [
    1 => 'Alpha',
    3 => 'Beta',
    10 => 'Gamma',
    //...
];

$class = $classMap[$a];
$obj = new $class();


проверки добавить по вкусу
... << RSDN@Home 1.2.0 alpha 5 rev. 67>>
Re: (PHP) Рефакторинг if - else условий
От: iPrior Россия darkmonk9@gmail.com
Дата: 18.05.15 08:37
Оценка:
Мне кажется if -ы и/или switch..case -ы намного лучше, чем подстановка переменной вместо имения класса, при его инициализации, как советую предыдущие авторы.
Я это имею в виду:
$classMap = [
    1 => 'Alpha',
    3 => 'Beta',
    10 => 'Gamma',
    //...
];

$class = $classMap[$a];
$obj = new $class();


Потом можно намаяться с отладкой да и вообще... хлопотно это.

Мне кажется, если уж их 100 штук, надо вынести это всё в отдельный класс, в стиле фабрики, например:
final class ObjectCreator
{
    public static function createByStringVar($stringVar)
    {
        $stringVar = (string)$stringVar;
        switch($stringVar) {
            case 'a':
                return self::createClassA();
            case 'b':
                return self::createClassB();
            default:
                throw new Exception('Unknown class');
        }
    }

    public static function createClassA()
    {
        return new classA();
    }

    public static function createClassB()
    {
        return new classB();
    }

    protected function __construct()
    {
    }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.