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

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

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

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

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

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

Лучший ответ:

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

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

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

return $something > $somethingelse;

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

Ответ №1

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

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

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

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

Ответ №2

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

Ответ №3

Вариант я prever b. Это не только более читаемо (вы точно знаете, что вам не нужно рассматривать какой-либо из оставшегося кода после инструкции return), но он также более безопасен.

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

Ответ №4<?php function theoreticalFunction( $var ) { if( $something > $somethingelse ){ return true; } return false; } ?>

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

Ответ №5

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

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

Содержание

  1. Подход A
  2. Подход B
  3. Подход C.1
  4. Подход C.2
  5. Подход D
  6. Заключение

Подход A

<?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.

Подход B

<?php function isTheVariableNull($var) { return (null === $var); }

Плюсы:

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

Минусы:

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

Подход 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 будет в порядке с
подход В.

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

Оцените статью
Добавить комментарий