如何正确重构此功能?
How to refactor this function properly?
我有以下 PHP 函数,它接受两个变量,使用多个 if/else
语句检查它们的值并操纵它们的值。如何使这段代码更具可读性和易于理解,即重构它?
$myarr = somevalue();
public function messy($var, $number) {
if (is_array($var)) {
foreach ($var as $i => $v) {
if (isset($myarr[$v])) {
if ($number == false || $number[$i] == "_NONE_" || $myarr[$v] == $number[$i]) {
unset($myarr[$v]);
}
else {
$myarr[$v] = $number[$i];
}
}
else {
if ($number != $check_value) {
$myarr = $myarr + array($v => $number[$i]);
}
}
}
}
else {
if (isset($myarr[$var])) {
if ($myarr[$var] == $number || $number == "_NONE_" || $number == false) {
unset($myarr[$var]);
}
else {
$myarr[$var] = $number;
}
}
else {
if ($number != false) {
$myarr = $myarr + array($var => $number);
}
}
}
}
一些一般性提示:
- 从域而不是编程的角度为变量赋予有意义的名称(例如,不是
$key
和 $value
,而是 $orderId
和 $order
)
- 尽量减少缩进量。您拥有的缩进越多,手头代码的心智能力就越多
- 将部分内容提取到具有有意义名称的单独私有方法中(参见 1)
- 用早期 returns
替换 else 语句
- 将您正在修改的数据包装在 class 中并进行设计,以便您可以通过调用其上的方法来修改它
作为提取到私有方法 (3) 的一个小示例,您可以执行如下操作:
public function messy($var, $number) {
if (is_array($var)) {
$myarr = $this->handleArrayCase($var, $number);
}
else {
$myArr = $this->handleNonArrayCase($var, $number);
}
}
private function handleArrayCase($var, $number) {
foreach ($var as $i => $v) {
if (isset($myarr[$v])) {
if ($number == false || $number[$i] == "_NONE_" || $myarr[$v] == $number[$i]) {
unset($myarr[$v]);
}
else {
$myarr[$v] = $number[$i];
}
}
else {
if ($number != $check_value) {
$myarr = $myarr + array($v => $number[$i]);
}
}
}
return $myarr;
}
private function handleNonArrayCase($var, $number) {
if (isset($myarr[$var])) {
if ($myarr[$var] == $number || $number == "_NONE_" || $number == false) {
unset($myarr[$var]);
}
else {
$myarr[$var] = $number;
}
}
else {
if ($number != false) {
$myarr = $myarr + array($var => $number);
}
}
return $myarr;
}
请注意,这不是一个有效的示例,它不遵循关于有意义的名称的规则,因为我没有足够的上下文来这样做。
我有以下 PHP 函数,它接受两个变量,使用多个 if/else
语句检查它们的值并操纵它们的值。如何使这段代码更具可读性和易于理解,即重构它?
$myarr = somevalue();
public function messy($var, $number) {
if (is_array($var)) {
foreach ($var as $i => $v) {
if (isset($myarr[$v])) {
if ($number == false || $number[$i] == "_NONE_" || $myarr[$v] == $number[$i]) {
unset($myarr[$v]);
}
else {
$myarr[$v] = $number[$i];
}
}
else {
if ($number != $check_value) {
$myarr = $myarr + array($v => $number[$i]);
}
}
}
}
else {
if (isset($myarr[$var])) {
if ($myarr[$var] == $number || $number == "_NONE_" || $number == false) {
unset($myarr[$var]);
}
else {
$myarr[$var] = $number;
}
}
else {
if ($number != false) {
$myarr = $myarr + array($var => $number);
}
}
}
}
一些一般性提示:
- 从域而不是编程的角度为变量赋予有意义的名称(例如,不是
$key
和$value
,而是$orderId
和$order
) - 尽量减少缩进量。您拥有的缩进越多,手头代码的心智能力就越多
- 将部分内容提取到具有有意义名称的单独私有方法中(参见 1)
- 用早期 returns 替换 else 语句
- 将您正在修改的数据包装在 class 中并进行设计,以便您可以通过调用其上的方法来修改它
作为提取到私有方法 (3) 的一个小示例,您可以执行如下操作:
public function messy($var, $number) {
if (is_array($var)) {
$myarr = $this->handleArrayCase($var, $number);
}
else {
$myArr = $this->handleNonArrayCase($var, $number);
}
}
private function handleArrayCase($var, $number) {
foreach ($var as $i => $v) {
if (isset($myarr[$v])) {
if ($number == false || $number[$i] == "_NONE_" || $myarr[$v] == $number[$i]) {
unset($myarr[$v]);
}
else {
$myarr[$v] = $number[$i];
}
}
else {
if ($number != $check_value) {
$myarr = $myarr + array($v => $number[$i]);
}
}
}
return $myarr;
}
private function handleNonArrayCase($var, $number) {
if (isset($myarr[$var])) {
if ($myarr[$var] == $number || $number == "_NONE_" || $number == false) {
unset($myarr[$var]);
}
else {
$myarr[$var] = $number;
}
}
else {
if ($number != false) {
$myarr = $myarr + array($var => $number);
}
}
return $myarr;
}
请注意,这不是一个有效的示例,它不遵循关于有意义的名称的规则,因为我没有足够的上下文来这样做。