2010-08-31 2 views
1

Учитывая этот безобразный метод:Когда возвращать значения в PHP?

public function convert_cell_value($val, $type) 
{ 
    if($type == 'String') 
    { 
     return $val; 
    } 
    elseif($type == 'Number') 
    { 
     if($val - intval($val) > 0) 
     { 
      return $val; 
     } 
     else 
     { 
      return intval($val); 
     } 
    } 
    else 
    { 
     return $val; 
    } 
} 

Теперь мои десять миллиардов $ вопроса: когда я должен возвращать значение (не в этом методе, но любой другой, как это), чтобы применить СУХИЕ принципы и идти на производительность тоже. Или: Что-то не так с моей мыслью о производительности, и это не имеет никакого отношения к этому, когда я сразу возвращаю значение?

Бонусный вопрос: есть ли более простой трюк, чтобы получить десятичные знаки, чем это?

if($val - intval($val) > 0) 
{ 
    return $val; 
} 

Спасибо за ваше драгоценное время, Fabrik

ответ

6

Вы можете упростить логику метода для этого:

public function convert_cell_value($val, $type) 
{ 
    if ($type === 'Number' && ($ret = intval($val)) == $val) { 
     return $ret; 
    } 
    return $val; 
} 

Или, если вы хотите добавить больше типов, используйте switch:

public function convert_cell_value($val, $type) 
{ 
    switch ($type) { 
    case 'Number': 
     if (($ret = intval($val)) == $val) { 
      return $ret; 
     } 
    case 'String': 
    default: 
     return $val; 
    } 
} 

Вы также можете использовать только один return a d замените return $ret на $val = $ret, чтобы вернуть правильное значение.

+0

Благодарим вас за ответ, Gumbo. Чистота и удобочитаемость, но трюк! :) – fabrik

+0

@fabrik: Спасибо, добро пожаловать! – Gumbo

1

Поскольку ваш код будет работать только через один вариант, я бы сохранил возвращаемое значение в переменной и вернул его в конце метода.

0

Как правило, я предпочитаю иметь только 1 функцию возврата для каждой функции для удобочитаемости. Имея переменную, которая возвращается, 99,99% так же быстро, как возвращение напрямую, и гораздо проще отлаживать.

// code from Gumbo 
public function convert_cell_value($val, $type) 
{ 
    if ($type === 'Number' && ($ret = intval($val)) == $val) { 
     $val = $ret; // this is the extra assigment 
    } 
    return $val; // only 1 return 
} 
0

Это зависит от функции. Если у вас есть функция, которая выполняет некоторые другие (и тяжелые эксплуатационные расходы) проверки, а возвращаемое значение должно быть ложным, если одна проверка не удалась, имеет смысл немедленно ее вернуть.

Если это просто «if (condition1) else» или простой переключатель, я бы просто вернул его в конце из-за лучшей читаемости.

2

Ваша функция здесь может быть переработана как:

function convert_cell_value($val, $type) 
{ 
    if ($type == 'Number') 
    return intval($val); 
    else 
    return $val; 
} 

На практике возвращение значения редко подлежит СУХИМ, так как «возвращение» является незначительной избыточностью, которая обычно может быть заменена только посредством присвоения переменных несколько раз и один раз возвращает эту переменную.

Что может быть аргументом против того, несколько операторов возврата является SESE (однократная одного выхода), который утверждает, должен быть только один оператор возврата, для удобства понимания (вы можете пропустить один) и причины очистки (вы должны очистите все выделенные ресурсы, прежде чем вы вернетесь).

В такой ситуации, как ваша, ваша функциональная структура эффективно «решает, что возвращать», поэтому аргумент читаемости не применяется.

+0

+1 из-за вашего четкого описания о DRY и SESE. Это то, о чем я никогда не слышал: o Спасибо Victor – fabrik

+0

:) добро пожаловать –

1

Использование тройного и неявного литья.

public function convert_cell_value($val, $type) { 
    return $type === 'Number' && !is_float($val + 1) ? intval($val): $val; 
} 

Кроме того, если вы проверили, имеет ли значение десятичное значение, вместо этого используйте is_float.intval производит строковое целое значение . Поэтому, если у вас есть значение ниже и сравнивается, результатом будет false, хотя он должен быть true.

intval('420000000000000000000'); // 2147483647 
+0

+1 из-за экстремального компактного решения. Так что онлайнер, как и сам метод, не имеет смысла :) Спасибо! – fabrik

Смежные вопросы