Практика программирования с функцией - PullRequest
8 голосов
/ 22 августа 2011

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

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

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

Ответы [ 5 ]

6 голосов
/ 22 августа 2011

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

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){}
}
2 голосов
/ 22 августа 2011

В 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);
 }
2 голосов
/ 22 августа 2011

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

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

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

0 голосов
/ 22 августа 2011

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

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

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

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

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

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

0 голосов
/ 22 августа 2011

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

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

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

$a=5;
foo($a);
// $a is 6 here
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...