2012-06-17 4 views
4

Этот вопрос касается, в частности, PHP, но я предполагаю, что он может быть применим и к другим языкам.-1 как возвращаемое значение

Я заметил, что между PHP4 и PHP5 разработчики языка перешли от использования -1 в качестве возвращаемого значения для использования констант или других форм вывода. Это имеет смысл, так как -1 не особенно впечатляет, и я предполагаю, что эта практика привела к путанице.

Это говорит о том, что я иногда склонен возвращать -1, когда я хочу быстро добавить еще один вариант возврата к функции, и -1 часто кажется совершенно верным способом выразить результат, для которого я кодирую.

Так вот мои вопросы:

  1. мое наблюдение в целом правильно, относительно отойти от -1 в качестве возвращаемого значения в PHP5 против PHP4?

  2. Каковы минусы возврата -1, за исключением причин, о которых я упоминал выше, в которых возвращаемое значение -1 не способствует позитивной ясности кода?

ответ

6

Это просто догадка, но по моему опыту существует небольшая причина или согласованность в выборе вариантов в PHP. Я также нахожу много функций, которые возвращают FALSE при сбое, многие с добавленной записью, что вы должны явно различать FALSE и другие (действительные) значения, которые принуждают к FALSE, например. 0. В таких случаях я думаю, -1 является много более приятное возвращаемое значение.

Конечно, вы всегда можете просто вернуть -1 и определить константы, имеющие значащие имена и только сопоставленные с -1.

+4

«Есть немного оснований или согласованности для выбора вариантов в PHP» - [Это не может быть правдой] (http://me.veekun.com/blog/2012/04/09/php-a-fractal-of-bad-design /) – nickb

2

Я бы предположил, что любые PHP-функции, которые все еще возвращают -1, делают это по устаревшим причинам.

Для простых функций, где есть логичный разумный ответ об ошибке, который не требует возврата загадочного числового кода, тогда это необходимо использовать. Например, для сообщения о том, что произошло, может быть достаточно, чтобы вернуть null, false или 0. Но для более сложных функций, особенно тех, которые могут иметь несколько режимов отказа, рассмотрите их разбивку на разные функции, каждая из которых обрабатывает меньшую часть общей задачи.

Вы также можете бросить исключение:

function doSomething() { 
    if (fooFails()) { 
     throw new Exception('Foo failed to work properly.'); 
    } else if (barFails()) { 
     throw new Exception('Bar failed this time.'); 
    } 

    return "blahblah"; 
} 

Вы можете также подкласс Exception класса, чтобы обеспечить еще больше конкретики, и вы можете обнаружить, какой из них с помощью примерки поймать блок. В общем, я думаю, что лучше использовать объектно-ориентированные принципы, подобные этому. Он производит код, который намного понятнее и удобен в обслуживании, особенно через 6 месяцев после того, как вы полностью забыли, почему вы написали свой код так, как вы это делали.

class FooException extends Exception { 
    // nothing else needed here 
} 

class BarException extends Exception { 
    // nothing else needed here 
} 

function doSomething() { 
    if (fooFails()) { 
     throw new FooException(); 
    } else if (barFails()) { 
     throw new BarException(); 
    } 

    return "blahblah"; 
} 

Затем вы можете использовать:

try { 
    $output = doSomething(); 

} catch (FooException $e) { 
    // respond to the FooException case 

} catch (BarException $e) { 
    // respond to the BarException case 

} catch (Exception $e) { 
    // respond to any and all other exceptions that might be thrown 
} 
+2

Это зависит от того, что делают функции, и является ли причина возврата '-1' реальной * исключительной * причиной. Исключение составляют структуры потока управления и, как правило, ошибки сигнала и другие условия. Если у вас есть что-то такое же простое, как поиск подстроки в строке, я сомневаюсь, что вы выбрали исключение, если подстрока не найдена, это правильная вещь. – Joey

+0

Хорошие очки. Но в примере подстроки, возвращая нулевую или ложную работу, также хорошо. Я не защищаю использование исключений в каждом случае, но при использовании null, false, 0 или что-то подобное просто не будет охватывать диапазон возможных режимов отказа, исключения могут быть единственным ясным способом сообщить, что произошло. – curtisdf

+0

Я обновил свой ответ для ясности, особенно в отношении простых функций, как вы упомянули. – curtisdf

1

Это дело вкуса. Я лично предпочитаю использовать цифры. Они выглядят приятнее для меня.

Но в некоторых случаях предпочтительнее использовать true и false. Нравится этот:

function isXYZ($a) { 
    if (...) return true; 
    return false; 
} 
Смежные вопросы