Какая лучшая передача функций – переменные или массивы / объекты?

Какова наилучшая практика передачи данных в функции – переменные или массивы (объекты).

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

function do_something($data, $user) // $user is object 

или

 function do_something($data, $user_name, $user_id) // only variables 

Какова наилучшая практика для этого случая?

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

 function do_something($var1, $var2, $var3, $var4 = false, $var5 = '') { //process business logic here } 

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

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

Таким образом, вы можете переписать приведенную выше логику следующим образом:

 function do_something($args = array()) { $myvar = (array_key_exists('mykey', $args)) ? $args['mykey'] : get_default_value('mykey'); //process business logic here } 

Для всех сценариев нет лучшей практики. Используйте один из них в зависимости от цели вашей функции:

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

  • Вы должны передать объект, если ваша функция будет каким-то образом манипулировать объектом, либо путем изменения его свойств, либо путем вызова его методов.