Лучший способ передать значения функции, когда их много?

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

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

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 ); 

Related of "Лучший способ передать значения функции, когда их много?"

Есть еще один способ, похожий на ООП: создать объект параметра (например, человека) с полями «имя», «доб», «телефон», «адрес» (это называется рефакторинг объектов «Параметр» в книге «Рефакторинг» Фаулера). Это кажется уместным в вашем случае, поскольку все поля, которые вы передаете функции, действительно связаны с одним объектом.

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

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

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

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

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

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