Я работаю над проектом, который требует от меня создания отчета на основе приобретенной аренды. Я должен вести подсчет по каждому виду аренды и суммировать соответствующие итоги. В настоящее время я использую блок переключателей, чтобы определить, какое действие предпринять на основе текущей аренды. Тем не менее, я понимаю, что это нарушает принцип 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?