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

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

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

Я интересен в мнениях (с разработкой) о том, что вы считаете лучшей практикой при возвращении из пользовательской функции PHP.

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

подходим к a.

заполнение возвращаемой переменной и ее возврат в конце функция:

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

подход b.

возврат в каждой конечной точке:

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

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

Я просмотрел рекомендации PSR, но ничего не видел (но я, возможно, пропустил его, поэтому, пожалуйста, не стесняйтесь указывать мне ПРЛ со ссылкой :) ).

расширение исходного вопроса:

используется ли метод для возврата различных в зависимости от ожидаемого/желаемого типа вывода?

изменяется ли этот метод в зависимости от использования процедурных или объектно-ориентированных методов программирования? Как показывает этот вопрос, ориентация объекта приносит свои собственные эксцентриситеты для дальнейшего расширения возможных параметров форматирования/презентации рекомендации по методам возврата в В PHP

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

6 ответов


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

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

return $something > $somethingelse;

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


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

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

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

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


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


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

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


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

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


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

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

Подход

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

плюсы:

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

плюсы:

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

Подойти К C. 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 предлагает вам создать другая функция, которая обрабатывает логику всех вложенных блоков. Функция должно быть атомные, он должен делать только одно. Если он делает слишком много работы, имеет слишком много логики, ее трудно поддерживать и понимать. Создание другой функции возможно, это хороший вариант.

Приблизиться К C. 2

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

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

плюсы:

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

плюсы:

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

Приблизиться D

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

плюсы:

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

Const:

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

вывод

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

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