Создание * эффективного * интерфейса if / then для нетехнических пользователей для управления потоком данных в PHP - PullRequest
2 голосов
/ 12 апреля 2010

В настоящее время я создаю внутренний инструмент, который будет использоваться нашим руководством для управления потоком трафика. Я создал интерфейс if / then, позволяющий пользователю устанавливать условия для определенных результатов, однако неэффективно использовать оператор switch для управления потоком. Как я могу улучшить эффективность моего кода? Пример кода:

            if($previous['route_id'] == $condition['route_id'] && $failed == 0) //if we have not moved on to a new set of rules and we haven't failed yet
        {   
            switch($condition['type'])
            {
                case 0 :
                    $type = $user['hour'];
                break;
                case 1 :
                    $type = $user['location']['region_abv'];
                break;
                case 2 :
                    $type = $user['referrer_domain'];
                break;
                case 3 :
                    $type = $user['affiliate'];
                break;
                case 4 :
                    $type = $user['location']['country_code'];
                break;
                case 5 :
                    $type = $user['location']['city'];
                break;
            }
            $type = strtolower($type);
            $condition['value'] = strtolower($condition['value']);

            switch($condition['operator'])
            {
                case 0 :
                    if($type == $condition['value']);
                    else $failed = '1';
                break;
                case 1 :
                    if($type != $condition['value']);
                    else $failed = '1';
                break;
                case 2 :
                    if($type > $condition['value']);
                    else $failed = '1';
                break;
                case 3 :
                    if($type >= $condition['value']);
                    else $failed = '1';
                break;
                case 4 :
                    if($type < $condition['value']);
                    else $failed = '1';
                break;
                case 5 :
                    if($type <= $condition['value']);
                    else $failed = '1';
                break;
            }
        }

Ответы [ 5 ]

1 голос
/ 12 апреля 2010

Один из способов немного изменить его - определить, какие условия наиболее вероятны, и поместить эти параметры в верхнюю часть if / then, чтобы вам не пришлось проваливаться далеко до того, как произойдет ИСТИННАЯ оценка. Чем меньше проверок вы должны сделать, тем быстрее и эффективнее это будет.

0 голосов
/ 03 июня 2010

Способ, которым я решил эту проблему, был довольно простым. Когда правила if / then созданы, PHP автоматически генерирует PHP-скрипт со всеми сценариями if / then, записанными в коде. Затем PHP просто загружает этот файл и выполняет его. Довольно просто =)

0 голосов
/ 13 апреля 2010

Если есть какой-либо из этих случаев, который более вероятен, то вы можете сделать это смещением к этому ... это по крайней мере сделает его более эффективным для этого случая (хотя и довольно уродливым). Просто мои $ 0,02

0 голосов
/ 12 апреля 2010

По сути, у вас есть конечный автомат (FSM). Возможно, вы захотите написать синтаксический анализатор для ваших правил, который создает сетевую (графическую) структуру, содержащую каждый элемент как отдельный объект, связанный с другими объектами (то есть маршрутами). Тогда каждый элемент будет иметь (перегруженную) функцию, которая может напрямую обращаться к необходимым параметрам и операторам.

Существует целый ряд инструментов (google it), которые вы можете использовать для генерации конечных автоматов или для развития собственного языка и движка.

0 голосов
/ 12 апреля 2010
case 0 :
      if($type == $condition['value']);
      else $failed = '1';
      break;

Хотя с точки зрения эффективности выполнения это не будет иметь значения, вы можете попытаться изменить свою логику, чтобы сделать намерения более читабельными.

case 0 :
    $success = ($type == $condition['value']);
    break;

и, конечно, обновите свое управляющее условие:

$success = true;   // you probably want to start off optimistic ($success is bool)
...
if($previous['route_id'] == $condition['route_id'] && $success)
...
...