Лучшая практика для возврата в PHP функции / метода

Я рефакторинг обширной базы кода сверхурочно. В долгосрочной перспективе мы собираемся разработать всю систему в классах, но в то же время я использую возможность усовершенствовать свои навыки 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

Пожалуйста, постарайтесь уточнить ваши объяснения. Меня интересует, ПОЧЕМУ вы выбираете предпочитаемый вами метод и что, в случае чего, заставило вас выбрать его по сравнению с другим методом.

7

Решение

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

Реальность такова, что это просто не то, что может быть предписано догматически. Некоторые алгоритмы лучше выражены как A, а другие работают лучше как B.

В вашем конкретном случае ни один не является «лучшим»; Ваш код должен быть написан как:

return $something > $somethingelse;

Мы надеемся, что это послужит примером того, что просто не существует такой вещи, как общеприменимое правило.

3

Другие решения

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

Другие вещи, которые я буду часто делать, включают падение финала else по умолчанию:

if ($something > $somethingelse) {
return true;
}
return false;

и на самом деле, условия формы if (boolean) return true; else return false, может быть сокращено еще дальше (если вам понятнее) до return ($something > $somethingelse);, Извлечение сложного предложения if из кода, подобного этому, в полезно названную функцию может помочь прояснить смысл кода.

5

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

В случае возврата значения, я думаю, важная вещь
читабельность. Иногда лучше немного потерять
производительности для кода, который является более читабельным и обслуживаемым.
Я постараюсь показать некоторые примеры с за и против.

Подход А

<?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);
}

Плюсы:

  • Читаемость. Код легко прочитать и понять, на первый взгляд мы
    знать, что функция проверяет, является ли переменная нулевой.
  • Лаконичность. Есть только одно утверждение, и в этом случае все хорошо и понятно.

Минусы:

  • Ограничить. Эта запись ограничена очень маленькими функциями. Используя эту запись
    или даже троичный оператор становится сложнее понять в более сложных
    функции.

Подход С.1

<?php
function doingSomethingIfNotNullAndPositive($var)
{
if (null !== $var) {
if (0 < $var) {
//Doing something
} else {
return 0;
}
} else {
return -1;
}
}

Плюсы:

  • Ясность. Каждый случай явный, мы можем реконструировать логика
    функция при чтении.

Минусы:

  • Читаемость. При добавлении многих if..else Заявления код действительно меньше
    удобочитаемый. Код с отступом много раз выглядит грязным. Представьте код
    с шестью вложенными if,
  • Трудно добавить код. Поскольку логика кажется сложной (даже если это не так),
    трудно добавить код или логику в функцию.
  • Много логики. Если у вас много if..else вложенный это возможно потому, что вы
    должен создать вторую функцию. IDE NetBeans, например, предлагает вам создать
    другая функция, которая обрабатывает логику всех ваших вложенных блоков. Функция
    должно быть атомное, это должно сделать только одно. Если он делает слишком много работы, имеет
    слишком много логики, трудно поддерживать и понимать. Создание другой функции
    может быть хорошим вариантом.

Подход С.2

Этот подход призван представить альтернативу нотации С.1.

<?php
function doingSomethingIfNotNullAndPositive($var)
{
if (null === $var) {
return -1;
} elseif (0 >= $var) {
return 0;
}
//Doing something
}

Плюсы:

  • Читаемость. Эта запись очень удобочитаема. Это
    Легко понять, какой результат мы получим по заданному значению.
  • Ясность. Как и в случае C.1, этот подход явен в каждой ветви
    состояние.

Минусы:

  • Трудно добавить логику. Если функция становится немного сложнее,
    добавить логику было бы сложно, потому что нам может понадобиться переместить все ветви
    состояние.

Подход D

<?php
function kindOfStrlen($var)
{
$return = -1;
if (is_string($var)) {
$return = strlen($var);
}
return $return;
}

Плюсы:

  • Значение по умолчанию. В этой структуре мы видим, что значение по умолчанию обрабатывается
    с начала. У нас есть логика в нашей функции, но если мы введем в нет
    филиал у нас есть значение в любом случае.
  • Легкость добавления логики. Если нам нужно добавить ветку if это легко и не
    изменить структуру функции.

Const:

  • Не обязательная переменная. В этом случае $return переменная не обязательна, мы
    написал бы ту же функцию, не используя ее. Решение было бы
    return -1 в конце и вернуться strlen($var) в случае, и это не будет
    быть менее читабельным

Заключение

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

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

1

Использование подхода b более приемлемо для меня, потому что в подходе a вы написали очень мало строк кода, но если есть много строк кода и много возвращаемых операторов, то есть вероятность, что я где-то буду использовать неправильный тип возврата, где $ возвращению было назначено какое-то другое место, и я этого не заметил.

0

Я предпоследний вариант б. Мало того, что это более читабельно (вы точно знаете, что вам не нужно рассматривать какой-либо из оставшегося кода после return заявление), но это также более отказоустойчиво.

Если у вас либо есть ошибка в оставшемся коде, либо вы столкнулись с набором условий, которые вы не учли при проектировании системы, возможно, ваш результат изменится. Это не может произойти, когда вы выходите из функции с return [$someVariable];

0
<?php
function theoreticalFunction( $var )
{
if( $something > $somethingelse ){
return true;
}
return false;
}
?>

Этот подход также можно использовать, как в операторе RETURN, программный курсор возвращается назад, и следующий оператор не будет выполнен.

0
По вопросам рекламы [email protected]