Я рефакторинг обширной базы кода сверхурочно. В долгосрочной перспективе мы собираемся разработать всю систему в классах, но в то же время я использую возможность усовершенствовать свои навыки PHP и улучшить часть унаследованного кода, который мы используем на нескольких сотнях веб-сайтов.
Со временем я прочитал противоречивые статьи о том, как лучше всего возвращать данные из пользовательской функции, обычно дебаты делятся на две категории: те, которые касаются наилучшей технической практики, и те, которые обеспокоены простотой чтения и представления.
Меня интересуют мнения (с подробностями) о том, что вы считаете наилучшей практикой при возвращении из пользовательской функции PHP.
Я не определился с тем, какой из нижеперечисленных принципов лучше использовать, используя эту базовую теоретическую функцию, например;
Подход а.
Заполняем возвращаемую переменную и возвращаем ее в конце функции:
<?php
function theoreticalFunction( $var )
{
$return = '';
if( $something > $somethingelse ){
$return = true;
}else{
$return = false;
}
return $return;
}
?>
Подход б.
Возвращаясь к каждой конечной точке:
<?php
function theoreticalFunction( $var )
{
if( $something > $somethingelse ){
return true;
}else{
return false;
}
}
?>
Возможный дубликат мог быть Какова лучшая практика PHP для использования функций, которые возвращают true или false? однако это не ограничивается просто истиной или ложью, несмотря на мой основной пример выше.
Я просмотрел руководящие принципы PSR, но ничего не увидел (но, возможно, я пропустил это, поэтому, пожалуйста, не стесняйтесь указывать мне PSR со ссылкой :)).
Расширение исходного вопроса:
Используется ли метод возврата по-разному в зависимости от ожидаемого / желаемого типа вывода?
Меняется ли этот метод в зависимости от использования процедурных или объектно-ориентированных методов программирования? Как показывает этот вопрос, объектная ориентация привносит свои эксцентриситеты для дальнейшего расширения возможных вариантов форматирования / представления. Лучшие практики для методов возврата в PHP
Пожалуйста, постарайтесь уточнить ваши объяснения. Меня интересует, ПОЧЕМУ вы выбираете предпочитаемый вами метод и что, в случае чего, заставило вас выбрать его по сравнению с другим методом.
Есть люди, спорящие за единые точки выхода в функциях (только один return
в конце) и другие, которые спорят за провал / возврат рано. Это просто вопрос мнения и читаемости / понятности в каждом конкретном случае. Вряд ли есть какой-либо объективный технический ответ.
Реальность такова, что это просто не то, что может быть предписано догматически. Некоторые алгоритмы лучше выражены как A, а другие работают лучше как B.
В вашем конкретном случае ни один не является «лучшим»; Ваш код должен быть написан как:
return $something > $somethingelse;
Мы надеемся, что это послужит примером того, что просто не существует такой вещи, как общеприменимое правило.
Я стремлюсь к скорейшему возвращению — выйди из функции, как только узнаешь, что происходит. Один тип этого использования, если называетсяПункт охраны‘
Другие вещи, которые я буду часто делать, включают падение финала else
по умолчанию:
if ($something > $somethingelse) {
return true;
}
return false;
и на самом деле, условия формы if (boolean) return true; else return false
, может быть сокращено еще дальше (если вам понятнее) до return ($something > $somethingelse);
, Извлечение сложного предложения if из кода, подобного этому, в полезно названную функцию может помочь прояснить смысл кода.
Я знаю, что этот вопрос старый, но он интересен и по мне
Есть много вещей, чтобы сказать об этом.
Первое, что нужно сказать, это то, что не существует реального стандарта возврата в функциях или методах.
Обычно это регулируется правилами, которым ваша команда решила следовать, но если вы единственный, кто занимается рефакторингом, вы можете делать то, что считаете нужным.
В случае возврата значения, я думаю, важная вещь
читабельность. Иногда лучше немного потерять
производительности для кода, который является более читабельным и обслуживаемым.
Я постараюсь показать некоторые примеры с за и против.
<?php
function getTariableType($var = null)
{
if (null === $var) {
return 0;
} elseif (is_string($var)) {
return 1;
} else {
return -1;
}
}
Плюсы:
Минусы:
if..else
с помощью скобок сделать код трудным для чтения иelse
утверждение не требуется, и код будетreturn -1
был только последним утверждением функции,else
,<?php
function isTheVariableNull($var)
{
return (null === $var);
}
Плюсы:
Минусы:
<?php
function doingSomethingIfNotNullAndPositive($var)
{
if (null !== $var) {
if (0 < $var) {
//Doing something
} else {
return 0;
}
} else {
return -1;
}
}
Плюсы:
Минусы:
if..else
Заявления код действительно меньшеif
,if..else
вложенный это возможно потому, что выЭтот подход призван представить альтернативу нотации С.1.
<?php
function doingSomethingIfNotNullAndPositive($var)
{
if (null === $var) {
return -1;
} elseif (0 >= $var) {
return 0;
}
//Doing something
}
Плюсы:
Минусы:
<?php
function kindOfStrlen($var)
{
$return = -1;
if (is_string($var)) {
$return = strlen($var);
}
return $return;
}
Плюсы:
if
это легко и неConst:
$return
переменная не обязательна, мыreturn -1
в конце и вернуться strlen($var)
в случае, и это не будетЯ не перечислил здесь все возможные обозначения, только некоторые из них. Что мы можем
думать о них не существует идеального, но в некоторых случаях подход кажется
лучше, чем другие. Например, нулевой функция будет в порядке с
подход Б.
Использование подхода или другого действительно зависит от вас, важно, чтобы
выберите логику и сохраняйте ее в течение всего вашего проекта.
Использование подхода b более приемлемо для меня, потому что в подходе a вы написали очень мало строк кода, но если есть много строк кода и много возвращаемых операторов, то есть вероятность, что я где-то буду использовать неправильный тип возврата, где $ возвращению было назначено какое-то другое место, и я этого не заметил.
Я предпоследний вариант б. Мало того, что это более читабельно (вы точно знаете, что вам не нужно рассматривать какой-либо из оставшегося кода после return
заявление), но это также более отказоустойчиво.
Если у вас либо есть ошибка в оставшемся коде, либо вы столкнулись с набором условий, которые вы не учли при проектировании системы, возможно, ваш результат изменится. Это не может произойти, когда вы выходите из функции с return [$someVariable]
;
<?php
function theoreticalFunction( $var )
{
if( $something > $somethingelse ){
return true;
}
return false;
}
?>
Этот подход также можно использовать, как в операторе RETURN, программный курсор возвращается назад, и следующий оператор не будет выполнен.