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