Лучший способ передать значения в функцию, когда есть много для отправки? - PullRequest
3 голосов
/ 19 сентября 2010

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

Например: (телефон и адрес необязательны)

function addInfo( $name, $dob, $phone='', $address='' ) {
       // Store data
}

addInfo( 'username', '01-01-2000', '1111111' ); // address is not given

ИЛИ

function addInfo( $info ) {
    // Store data
}

$info = array( 'name'=>'username', 
               'dob'=>'01-01-2000', 
               'phone'=>'1111111', 
               'address'=>'' );
addInfo( $info );

Ответы [ 4 ]

4 голосов
/ 19 сентября 2010

Мартин предлагает в " Чистый код ", что вы должны ограничить количество параметров максимум 2-3, чтобы сделать код понятным.Поэтому было бы лучше обернуть их в объект и передать объект в качестве параметра.Это определенно предпочтительнее.

3 голосов
/ 19 сентября 2010

Есть еще один OOP-подобный способ: создать объект параметра (например, person) с полями 'name', 'dob', 'phone', 'address' (это называется «Ввести рефакторинг объекта параметра» в «Рефакторинге» Фаулера) книга). В вашем случае это кажется уместным, поскольку все поля, которые вы передаете функции, на самом деле связаны с одним объектом.

1 голос
/ 19 сентября 2010

Хотя вторая версия функции кажется лучше, это не так.Это потому, что вы не знаете, какие данные ожидает функция.Массив элементов просто слишком общий.Объект подойдет лучше ИМХО.Объект класса хорошо определен, где вы ожидаете, например.объект Employee, и вы вызываете функцию с Employer, вызов завершится неудачей.

Итак, чтобы подвести итог, я бы использовал либо первую версию, либо способ объекта класса.

0 голосов
/ 19 сентября 2010

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

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

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

...