Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 修复具有高NPath复杂性的代码_Php_Phpmd - Fatal编程技术网

Php 修复具有高NPath复杂性的代码

Php 修复具有高NPath复杂性的代码,php,phpmd,Php,Phpmd,当PHPMD报告我的一些代码具有很高的NPath复杂性时,我正在使用PHP Mess Detector分析我的代码。一个例子是: function compareDates($date1, $date2){ if($date->year < $date2->year){ return -1; } if($date->year > $date2->year){ return 1; } if(

当PHPMD报告我的一些代码具有很高的NPath复杂性时,我正在使用PHP Mess Detector分析我的代码。一个例子是:

function compareDates($date1, $date2){
    if($date->year < $date2->year){
        return -1;
    }
    if($date->year > $date2->year){
        return 1;
    }
    if($date->month < $date2->month){
        return -1;
    }
    if($date->month > $date2->month){
        return 1;
    }
    if($date->day < $date2->day){
        return -1;
    }
    if($date->day > $date2->day){
        return 1;
    }
    // etc.. same for hour, minute, second.
    return 0;
}
函数比较($date1,$date2){
如果($date->year<$date2->year){
返回-1;
}
如果($date->year>$date2->year){
返回1;
}
如果($date->month<$date2->month){
返回-1;
}
如果($date->month>$date2->month){
返回1;
}
如果($date->day<$date2->day){
返回-1;
}
如果($date->day>$date2->day){
返回1;
}
//等等,小时,分钟,秒都一样。
返回0;
}
结果是该函数具有非常高的NPath复杂性。是否有一种通用的编码方式来降低此类控制结构和NPath复杂性


源代码:

排序函数必须返回-1,0,1是一种常见的误解。你能行

function compareDates($date1, $date2)
{
    return strtotime("{$date1->year}-{$date1->month}-{$date1->day}")
         - strtotime("{$date2->year}-{$date2->month}-{$date2->day}");
}
请注意,如果整数限制是一个问题,则可以使用不具有该限制的
DateTime
,例如

function compareDates($date1, $date2)
{
    return new DateTime("{$date1->year}-{$date1->month}-{$date1->day}")
         < new DateTime("{$date2->year}-{$date2->month}-{$date2->day}");
}
函数比较($date1,$date2)
{
返回新的日期时间(“{$date1->year}-{$date1->month}-{$date1->day}”)
year}-{$date2->month}-{$date2->day});
}
至于降低NPath复杂性,一般来说:您必须减少可能的执行路径的数量。首先看一下福勒的重构书中关于重构的章节


顺便说一句,我想知道提高时间有什么好处?它能做本机DateTime API不能做的事情吗?如果没有,我为什么要使用它?

排序函数必须返回-1,0,1,这是一个常见的误解。你能行

function compareDates($date1, $date2)
{
    return strtotime("{$date1->year}-{$date1->month}-{$date1->day}")
         - strtotime("{$date2->year}-{$date2->month}-{$date2->day}");
}
请注意,如果整数限制是一个问题,则可以使用不具有该限制的
DateTime
,例如

function compareDates($date1, $date2)
{
    return new DateTime("{$date1->year}-{$date1->month}-{$date1->day}")
         < new DateTime("{$date2->year}-{$date2->month}-{$date2->day}");
}
函数比较($date1,$date2)
{
返回新的日期时间(“{$date1->year}-{$date1->month}-{$date1->day}”)
year}-{$date2->month}-{$date2->day});
}
至于降低NPath复杂性,一般来说:您必须减少可能的执行路径的数量。首先看一下福勒的重构书中关于重构的章节


顺便说一句,我想知道提高时间有什么好处?它能做本机DateTime API不能做的事情吗?如果不是,我为什么要使用它?

我是PHP新手,这段代码不是也一样,只是简单而已

function compareDates($date1, $date2){
if(($date->year < $date2->year) || ($date->month < $date2->month) || ($date->day < $date2->day) {
    return -1;
}
 if($date->year > $date2->year) || ($date->month > $date2->month) || ($date->day > $date2->day) {
    return 1;
}
// etc.. same for hour, minute, second.
return 0;
}
函数比较($date1,$date2){
如果($date->year<$date2->year)| |($date->month<$date2->month)|($date->day<$date2->day){
返回-1;
}
如果($date->year>$date2->year)| |($date->month>$date2->month)| |($date->day>$date2->day){
返回1;
}
//等等,小时,分钟,秒都一样。
返回0;
}

我是PHP新手,这段代码不是也一样,只是很简单吗

function compareDates($date1, $date2){
if(($date->year < $date2->year) || ($date->month < $date2->month) || ($date->day < $date2->day) {
    return -1;
}
 if($date->year > $date2->year) || ($date->month > $date2->month) || ($date->day > $date2->day) {
    return 1;
}
// etc.. same for hour, minute, second.
return 0;
}
函数比较($date1,$date2){
如果($date->year<$date2->year)| |($date->month<$date2->month)|($date->day<$date2->day){
返回-1;
}
如果($date->year>$date2->year)| |($date->month>$date2->month)| |($date->day>$date2->day){
返回1;
}
//等等,小时,分钟,秒都一样。
返回0;
}

您的代码实际上相对简单,只是结构不好。我建议创建一个子函数,该函数接受两个参数并处理-1/1的返回,然后遍历一个字段数组进行检查,因为这会稍微容易一些,但是需要注意的是:

  • 你的方式还可以。它不干净,但很清楚,如果它能工作,就没有迫切需要改变它——任何一个看到它的程序员都能理解你在做什么,即使他们嘲笑你的实现

  • 复杂性不是圣杯。它很重要,作为一个做大量维护编程的程序员,我认为编写我维护的代码的人了解复杂性非常重要,但你不能完全避免复杂性,有时复杂的解决方案(使用McCabe的复杂性)是最容易阅读的

  • 我真正建议你做的唯一改变就是打一次回电。做如下操作:

    $compare_val = 0;
    

    在文件顶部,然后更改对elseifs的后续if调用,只需更新$compare_val并在函数末尾返回它,而不是返回值。

    您的代码实际上相对简单,只是结构不好。我建议创建一个子函数,该子函数接受两个参数并处理-1/1,然后遍历一个字段数组进行检查,因为这会稍微容易一点,但要注意以下几点:

  • 你的方式还可以。它不干净,但很清楚,如果它能工作,就没有迫切需要改变它——任何一个看到它的程序员都能理解你在做什么,即使他们嘲笑你的实现

  • 复杂性不是圣杯。它很重要,作为一个做大量维护编程的程序员,我认为编写我维护的代码的人了解复杂性非常重要,但你不能完全避免复杂性,有时复杂的解决方案(使用McCabe的复杂性)是最容易阅读的

  • 我真正建议你做的唯一改变就是打一次回电。做如下操作:

    $compare_val = 0;
    

    在文件顶部,然后更改对elseifs的后续if调用,而不是返回值,只需更新$compare_val并在函数末尾返回它。

    不,不需要。如果年份不同,则他不关心月份,因此他必须按照上面定义的顺序进行比较。不,是的esn不是。如果年份不同,那么他不关心月份,所以他必须按照上面定义的顺序进行比较。该框架是为交叉兼容性而设计的。就开发而言,我们正在与PHP A接口