Как провести рефакторинг этих нескольких блоков -if ?? Есть ли лучший способ сделать - PullRequest
0 голосов
/ 09 мая 2018

Этот блок кода проверяет, присутствует ли элемент или человек в определенной группе, и дает разрешение на просмотр только тем членам, которые присутствуют. Существует четыре таких группы и несколько сценариев или вероятностей. Это похоже на запах кода и чтобы узнать лучший способ сделать. fyi: элемент1, элемент2, элемент3, элемент4 - ключи для групп

if ((in_array('item1', (Authorization::getAdmin($Id)))) &&
                (in_array('item2', (Authorization::getAdmin($Id)))) &&
                (in_array('item3', (Authorization::getAdmin($Id)))) &&
                ((in_array('item4', (Authorization::getAdmin($Id)))))) {


            }
            elseif ((in_array('item2', (Authorization::getAdmin($Id)))) &&
                ((in_array('item3', (Authorization::getAdmin($Id))))) &&
                ((in_array('item4', (Authorization::getAdmin($Id)))))){

            }

            elseif ((in_array('item1', (Authorization::getAdmin($Id)))) &&
                ((in_array('item3', (Authorization::getAdmin($Id))))) &&
                ((in_array('item4', (Authorization::getAdmin($Id)))))){

            }

            elseif ((in_array('item1', (Authorization::getAdmin($Id)))) &&
                ((in_array('item2', (Authorization::getAdmin($Id))))) &&
                ((in_array('item4', (Authorization::getAdmin($Id)))))){

            }

            elseif ((in_array('item3', (Authorization::getAdmin($Id)))) &&
                ((in_array('item2', (Authorization::getAdmin($Id))))) &&
                ((in_array('item4', (Authorization::getAdmin($Id)))))){

            }


            elseif ((in_array('item3', (Authorization::getAdmin($Id)))) &&
                ((in_array('item2', (Authorization::getAdmin($Id))))) &&
                ((in_array('item1', (Authorization::getAdmin($Id)))))){

            }


            elseif ((in_array('item2', (Authorization::getAdmin($Id)))) &&
                ((in_array('item3', (Authorization::getAdmin($Id)))))) {

            }

            elseif ((in_array('item3', (Authorization::getAdmin($Id)))) &&
                ((in_array('item1', (Authorization::getAdmin($Id)))))) {


            }

            elseif ((in_array('item1', (Authorization::getAdmin($Id)))) &&
                ((in_array('item2', (Authorization::getAdmin($Id)))))) {

            }


            elseif ((in_array('item1', (Authorization::getAdmin($Id)))) &&
                ((in_array('item4', (Authorization::getAdmin($Id)))))) {

            }

            elseif ((in_array('item4', (Authorization::getAdmin($Id)))) &&
                ((in_array('item2', (Authorization::getAdmin($Id)))))) {

            }

            elseif ((in_array('item4', (Authorization::getAdmin($Id)))) &&
                ((in_array('item3', (Authorization::getAdmin($Id)))))) {

            }

           elseif(in_array('item1',(Authorization::getAdmin($Id))))
           {

           }

            elseif(in_array('item2',(Authorization::getAdmin($Id))))
            {

            }

            elseif(in_array('item3',(Authorization::getAdmin($Id))))
            {

            }

            elseif(in_array('item4',(Authorization::getAdmin($Id))))
            {

            }


        }

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Определенно поместите результат статического вызова функции в локальную переменную. Это сэкономит вам много вычислительной мощности и сократит код.

Мне нравится решение Don't Panic , и оно будет расширяться для его перекрестной индексации с вашей матрицей разрешений ...

$permissions = ['I can do this' => ['item1'], 'I can do that' => ['item1', 'item2'], ... ];
$groups = Authorization::getAdmin($Id);
$authorization = [];

foreach (['item1', 'item2', 'item3', 'item4'] as $group_key) {
  if (in_array($group_key, $groups)) {
    $authorization[] = $group_key;
  }
}

И способ получить результат разрешения - быстрый поиск по массиву.

$permission = array_search($authorization, $permissions );

Это дает вам единственный результат; если он более сложный, возможно, вам придется составить сложный оператор, чтобы разобраться с ним.

0 голосов
/ 09 мая 2018

Если я правильно понимаю, вы можете уменьшить это до:

$groups = Authorization::getAdmin($Id);

foreach (['item1', 'item2', 'item3', 'item4'] as $group_key) {
    if (in_array($group_key, $groups)) {
        // give authorization to view that group
    }
}
...