Как использовать принцип Open / Closed для замены блока переключателей, который изменяет общее состояние - PullRequest
0 голосов
/ 29 января 2020

Я работаю над проектом, который требует от меня создания отчета на основе приобретенной аренды. Я должен вести подсчет по каждому виду аренды и суммировать соответствующие итоги. В настоящее время я использую блок переключателей, чтобы определить, какое действие предпринять на основе текущей аренды. Тем не менее, я понимаю, что это нарушает принцип Open / Closed, поскольку мне придется изменять блок переключателей каждый раз, когда добавляется новая аренда. Я хотел бы, чтобы это соответствовало OCP, но я не уверен, как это сделать. Ниже мой код:

public function generateReport($rentals)
{
    $type_1_count = 0;
    $type_2_count = 0;
    $type_3_count = 0;

    $type_1_sum = 0;
    $type_2_sum = 0;
    $type_3_sum = 0;

    foreach ($rentals as $rental) {
        switch ($rental->type) {
            case 'TYPE_1':
                $type_1_count++;
                $type_1_sum += $rental->price;
                break;
            case 'TYPE_2':
                $type_2_count++;
                $type_2_sum += $rental->price;
                break;
            case 'TYPE_3':
                // some of the rentals include other rentals which must be accounted for
                $type_1_count++;
                $type_1_sum += $rental->price / 2;

                $type_3_count++;
                $type_3_sum += $rental->price / 2;
                break;
            default:
                echo 'Rental Not Identified';
        }
    }
    return compact('type_1_count', 'type_2_count', 'type_3_count', 'type_1_sum', 'type_2_sum', 'type_3_sum');
}

Я изменяю переменные общего состояния в зависимости от выбранного случая. Я рассмотрел много примеров OCP, но все они показывают, как выполнить действие или вернуть значение, но вместо этого мне нужно изменить общее состояние. Каков наилучший способ реорганизовать этот код, чтобы он был более согласован с OCP?

1 Ответ

0 голосов
/ 29 января 2020

Вы можете использовать ассоциативный массив. Вам просто нужно убедиться, что переменная установлена ​​первой. Примерно так:

   $all_rentals = [];
   foreach ($rentals as $rental) {
       // make sure the variable has a default value
       if(!isset($all_rentals[$rental->type."_count"]) {
           $all_rentals[$rental->type."_count"] = 0;
           $all_rentals[$rental->type."_sum"] = 0;
       }
       $all_rentals[$rental->type."_count"]++;
       $all_rentals[$rental->type."_sum"] += $rental->price;
   }

...

Таким образом, вы можете добавлять новые значения (типы аренды), не изменяя существующий код

...