Эта функция имеет слишком много параметров?

В конце я получил эту функцию. Я не знаю, нормально ли это или нет.

function user_registration($user_name, $user_email, $user_pass, $address, 
                           $city, $postalcode, $country, $phone, $mobilephone)

Как и почему я могу улучшить это?

19
задан reformed 19 June 2018 в 15:31
поделиться

9 ответов

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

class User {

  public function setName($name) {
    $this->name = $name;
  }

  [...]

  public function register() {

    //Validate input
    if (empty($this->name))
      $this->errors[] = "ERROR, Username must not be emtpy";

    //Add the user to the database
    //Your SQL query
    return empty($this->errors);
  }

}

$user = new User();
$user->setName("Peter");
$success = $user->register();

if (!$success)
  echo "ERRORS OCCURED: ".print_r($user->errors, true);
23
ответ дан 30 November 2019 в 02:18
поделиться

Решением было бы иметь только один параметр, который может содержать несколько частей данных - например, массив.

Ваша функция может быть определена следующим образом:

function user_registration(array $data) {
    // work with $data['name']
    // and $data['email']
    // ...
}

И вы бы назвали ее так:

user_registration(array(
    'name' => 'blah',
    'email' => 'test@example.com', 
    'pass' => '123456',
    // and so on
));


Хорошие вещи:

  • Вы можете легко добавлять / удалять «параметры».
  • «Параметры» могут передаваться в любом порядке

Не так уж и плохо:

  • Нет подсказки при вводе в IDE
  • Нет документации (например, phpDoc)
13
ответ дан 30 November 2019 в 02:18
поделиться

Как правило, вы всегда должны спросить: "Не слишком ли много параметров у этой функции?" - ответ да . Ваша интуиция подсказывает вам то, что ваш мозг еще не смог понять.

В этом конкретном случае первое, что приходит на ум, это то, что сначала нужно проверить ваш user cred.s (существует ли уже имя пользователя? Достаточно ли pw) и ваши данные пользователя должны быть добавлены отдельно, возможно, используя объект или массив.

4
ответ дан 30 November 2019 в 02:18
поделиться

Один из способов - передать массив в качестве параметра этой функции и поместить всю информацию в этот массив:

function user_registration(array $user_info)
{
   // process $user_info;
}
3
ответ дан 30 November 2019 в 02:18
поделиться

Лучше всего использовать функцию (метод) без каких-либо параметров. Функция с одним параметром лучше, чем функция с двумя параметрами. Функция с двумя параметрами лучше, чем функция с тремя параметрами и так далее.

2
ответ дан 30 November 2019 в 02:18
поделиться

Я создаю массив ключей вроде

$fields = array('field1', 'field2');
function register (array $values, array $keys)
{
    $data = array();
    foreach ($keys as $one)
    {
        if (isset($values[$one])) $data[$one] = $values[$one];
    }
    // or you can use array functions like array_flip and after - array intersect
}
2
ответ дан 30 November 2019 в 02:18
поделиться

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

«Если он не сломался, не чините его!»

9
ответ дан 30 November 2019 в 02:18
поделиться

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

С объектно-ориентированной точки зрения другие объекты должны иметь возможность манипулировать атрибутами. Вот почему атрибуты никогда не следует определять как «общедоступные». Они должны быть "закрытыми", например: [

private var $name;

] Причина в том, что когда другие объекты будут манипулировать этой переменной, правильная работа объекта находится под угрозой. С другой стороны, методы могут быть определены публично:

public function register() 

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

Могут выполняться две операции: чтение текущего значения атрибута с помощью методов Get и сохранение нового значения атрибута с помощью Установить методы .

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

Иногда лучше вообще не реализовывать метод get / set (например, showData ()). Это связано с тем, что использование геттеров и сеттеров в определенном классе может привести к снижению производительности. Однако это означает, что при изменении или реализации класса следует проявлять осторожность, пытаясь сохранить ложную информацию и, как следствие, подвергнуть риску целостность класса.

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

2
ответ дан 30 November 2019 в 02:18
поделиться

Я бы сделал это таким образом

fields=explode(",","name,surname,lastname,street,city,region,zip,country");
user_registration($fields);

Потому что я уверен, что эти переменные поступают из $ _POST

-6
ответ дан 30 November 2019 в 02:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: