Практика программирования с функцией

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

  • Плохо ли иметь функцию, которая возвращает либо массив, либо целое число, основанное на параметре?
  • Если так, как я могу решить это?

Я думаю, что было бы плохой практикой также просто копировать и вставлять всю функцию для 4-5 дополнительных строк.

5 ответов

Решение

Если это вообще возможно, я бы вызвал одну функцию из другой.

function getSingle($arg)
{
    // Do whatever it is your function should do...
    return 1;
}

function getMultiple($args)
{
    $out = array();
    foreach ($args as $arg) {
        $out[] = getSingle($arg);
    }

    return $out;
}

Для функции, которую вы имеете в виду, это может оказаться невозможным, но это может быть хорошим вариантом.


В качестве дополнительного примечания, поскольку функции связаны друг с другом, я бы написал их как методы класса, чтобы "сгруппировать" их вместе.

принимать Users например; Мне может понадобиться функция для получения одного пользователя, а другая - для нескольких пользователей. Имеет смысл собрать эти методы в классе:

class Users
{
    public function getUser($id){}

    public function getUsers(array $id = null){}
}

В PHP я бы сказал "одна функция - один тип вывода". (за исключением значения FALSE который имеет особое значение в PHP). Если PHP поддерживает перегрузку, это может отличаться, но это не так. Но вот вопрос, почему бы просто не иметь одну функцию, которую обертывают обе эти функции?

 function my_wrapped_function($param1, array $param2)
 {
     return $param1 * count($param2);
 }

 function get_array_from_wrapped( $param1, array $param2 )
 {
     return array( $param1, my_wrapped_function($param1, $param2));
 }
 function get_int_from_wrapped( $param1, array $param2 )
 {
     return my_wrapped_function($param1, $param2);
 }

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

Мое предложение

Всегда возвращайте массив (даже если он состоит из одного элемента) и имейте более общую функцию, которая легко обрабатывается.

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

Вот пример передачи по ссылке.

<?php
function foo(&$var)
{
    $var++;
}

$a=5;
foo($a);
// $a is 6 here
?>

Вы называете некоторые принципы здесь:

  1. Сделайте так, чтобы параметры функции имели одно значение (и функции в идеале должны иметь нулевые параметры, избегайте большего любой ценой)
  2. Заставить функцию делать только одно.
  3. Не повторяйся.

Я думаю, что все эти три действительны. Ваши вопросы звучат как обмен между 3. и 2. или 1. Я думаю, вы не должны обменивать их друг на друга.

Вы не поделились многим о том, что вы пытаетесь достичь с помощью этой функции, поэтому полностью абстрагированы, я вижу следующие пути:

  1. Вы столкнулись с проблемой дизайна. Редизайн и рефакторинг вашего кода.

Хм, звучит немного умно, но, честно говоря, вы можете либо не использовать итераторы должным образом (foreach), либо вы начинаете создавать функцию "одна функция делает все", чего не следует делать. Это будет дублировать код в конце.

Другие вопросы по тегам