2012-12-03 30 views
1

我得到了下面的代码片段,它的工作原理和做我需要做的。唯一的问题是我认为它有点“冗长”,可以做一些优化。如有可能,有人可以帮助我减少重复性。大部分的代码非常相似......写得更好看,更详细的代码

非常感谢

<?php 

// condition = Less Than; More Than; Between 
// noofweeks = this is the number of weeks chosen by the user 

function fmsSupplements($condition, $conditionWeeks, $noofweeks, $weekno, $weekStartno,  $weekEndno, $basicprice, $supplementAmnt, $supplementType) { 

if ($condition== "Between") { 
// I need to get the start and end values as the data in this parameter should look like 1-17 
$betweenArray = explode('-',$conditionWeeks); 
$startWeek = $betweenArray[0]; 
$endWeek = $betweenArray[1]; 
} 


if(($condition == "Less Than") && ($noofweeks < $conditionWeeks) && ($supplementType == 'Subtract') && ($weekno >= $weekStartno && $weekno <= $weekEndno)) { return $basicprice - $supplementAmnt; } 

elseif(($condition == "Less Than") && ($noofweeks < $conditionWeeks) && ($supplementType == 'Add') && ($weekno >= $weekStartno && $weekno <= $weekEndno)) { return $basicprice + $supplementAmnt; } 

elseif(($condition == "More Than") && ($noofweeks > $conditionWeeks) && ($supplementType == 'Subtract') && ($weekno >= $weekStartno && $weekno <= $weekEndno)) { return $basicprice - $supplementAmnt; } 

elseif(($condition == "More Than") && ($noofweeks > $conditionWeeks) && ($supplementType == 'Add') && ($weekno >= $weekStartno && $weekno <= $weekEndno)) { return $basicprice + $supplementAmnt; }  

elseif(($condition == "Between") && ($noofweeks >= $startWeek && $noofweeks <= $endWeek) && ($supplementType == 'Add') && ($weekno >= $weekStartno && $weekno <= $weekEndno)) { return $basicprice + $supplementAmnt; } 

elseif(($condition == "Between") && ($noofweeks >= $startWeek && $noofweeks <= $endWeek) && ($supplementType == 'Substract') && ($weekno >= $weekStartno && $weekno <= $weekEndno)) { return $basicprice - $supplementAmnt; } 

//if no conditions match, just return the unaltered basic price back 

else { return $basicprice ;} 

;} ?> 
+0

您也可以在http://codereview.stackexchange.com/寻求这方面的帮助 – Niko

回答

2

这IFS的一个列表可以写成一个嵌套如果。

最重要的变化:

  1. ($weekno >= $weekStartno && $weekno <= $weekEndno)是所有 条件的一部分,所以它是在外部如果。
  2. 如果使用或 (||),将与给定条件字符串匹配的三个变化条件 放入1中。
  3. 内在如果也单数。 Add导致 增加。 Subtract在减法。

所有归结为尽可能少的重复条件,虽然你应该记住,结构仍应该清楚。在某些情况下,这可能会更容易。

<?php 

// condition = Less Than; More Than; Between 
// noofweeks = this is the number of weeks chosen by the user 

function fmsSupplements($condition, $conditionWeeks, $noofweeks, $weekno, $weekStartno, $weekEndno, $basicprice, $supplementAmnt, $supplementType) { 
    if ($condition == "Between") { 
    // I need to get the start and end values as the data in this parameter should look like 1-17 
    $betweenArray = explode('-',$conditionWeeks); 
    $startWeek = $betweenArray[0]; 
    $endWeek = $betweenArray[1]; 
    } 

    if ($weekno >= $weekStartno && $weekno <= $weekEndno) 
    { 
    if (($condition == 'Less Than' && $noofweeks < $conditionWeeks) || 
     ($condition == 'More Than' && $noofweeks > $conditionWeeks) || 
     ($condition == 'Between' && $noofweeks >= $startWeek && $noofweeks <= $endWeek)) 
    { 
     // You can use a 'switch' as well, instead of if...elseif. 
     if ($supplementType == 'Subtract') { 
     return $basicprice - $supplementAmnt; 
     } elseif ($supplementType == 'Add' { 
     return $basicprice + $supplementAmnt; 
     } 
    } 
    } 
    return $basicprice; 
} ?> 

在不同的设置中,我把中间结果在单独的变量,我认为 使得它更具有可读性。我在这里加了一点更多的评论,解释了决定:

function fmsSupplements($condition, $conditionWeeks, $noofweeks, $weekno, $weekStartno, $weekEndno, $basicprice, $supplementAmnt, $supplementType) { 

    // Create two 'helper' booleans to make the if condition easier. 
    $weekInRange = ($weekno >= $weekStartno && $weekno <= $weekEndno); 
    $noOfWeeksInRange = 
     ($condition == 'Less Than' && $noofweeks < $conditionWeeks) || 
     ($condition == 'More Than' && $noofweeks > $conditionWeeks); 

    // Alternatively, you can break the single line above up in multiple 
    // lines, which makes debugging easier: 
    //$noOfWeeksInRange = ($condition == 'Less Than' && $noofweeks < $conditionWeeks); 
    //$noOfWeeksInRange |= ($condition == 'More Than' && $noofweeks > $conditionWeeks); 

    if ($condition == "Between") { 
    // I need to get the start and end values as the data in this parameter should look like 1-17 
    $betweenArray = explode('-',$conditionWeeks); 
    $startWeek = $betweenArray[0]; 
    $endWeek = $betweenArray[1]; 
    // Overwrite this variable with the condition that goes with 'Between'. 
    // We're already in that if, so we don't need to check 'Condition' again.. 
    // You could use betweenArray[0] and [1] in the condition below, but using 
    // the variables $startWeek and $endWeek does make it more readable. 
    $noOfWeeksInRange = ($noofweeks >= $startWeek && $noofweeks <= $endWeek); 
    } 

    // And not this 'if' is even more readable. 
    if ($weeksInRange && $noOfWeeksInRange) 
    { 
     // You can use a 'switch' as well, instead of if...elseif. 
     if ($supplementType == 'Subtract') { 
     return $basicprice - $supplementAmnt; 
     } elseif ($supplementType == 'Add' { 
     return $basicprice + $supplementAmnt; 
     } 
    } 
    return $basicprice; 
} ?> 
+0

你也可以使用三元运营商削减更多码。 'return($ supplementType =='Subtract')? $ basicprice - $ supplementAmnt:$ basicprice + $ supplementAmnt;' – bozdoz

+1

@bozdoz你可以,但我没有试图减少代码,我试图使它更易读,这不一定是相同的。此外,你有效地写了一个'if..else',而不是'if..elseif'。如果你传递既不是'Add'也不'Subtract'的$ supplementType?本身并不是一个坏建议,但是如果你想重构这样的代码,一般来说你必须小心不要改变功能。 – GolezTrol

+0

增加了第二种可能性。 B.t.w.我没有提到的是,如果你保持简短的代码,代码变得更加可读。允许自己在语句中添加换行符,或者分解条件,但首先将其中的一部分放入中间变量中。我没有碰到函数头,但我通常也会打破这个。经验法则:每行最多100个字符(以前是80,但这是旧的)。 – GolezTrol