如何使用Open/Closed原理替换修改共享状态的switch块
How to use the Open/Closed Principle to replace switch block that modifies shared state
我正在从事一个项目,该项目要求我根据购买的租金生成报告。我必须对每种类型的租金进行计数并计算相应的总数。目前我正在使用一个开关块来根据当前的租金确定要采取的行动。但是,据我了解,这违反了 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 示例,但它们都显示了如何执行操作或 return 值,但我需要改为修改共享状态。重构此代码以使其更符合 OCP 的最佳方法是什么?
您可以使用关联数组。您只需要确保首先设置变量。像这样:
$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;
}
...
这样您就可以添加新值(租赁类型)而无需修改任何现有代码
我正在从事一个项目,该项目要求我根据购买的租金生成报告。我必须对每种类型的租金进行计数并计算相应的总数。目前我正在使用一个开关块来根据当前的租金确定要采取的行动。但是,据我了解,这违反了 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 示例,但它们都显示了如何执行操作或 return 值,但我需要改为修改共享状态。重构此代码以使其更符合 OCP 的最佳方法是什么?
您可以使用关联数组。您只需要确保首先设置变量。像这样:
$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;
}
...
这样您就可以添加新值(租赁类型)而无需修改任何现有代码