У вас есть множество переменных, значения которых нужно передать в функцию, а запись
f(x,y,z,a,b,c,d,e,f,g)
выглядит уродливо. Что делать?
Ленивый вариант сокращения списка параметров -- объявить все или часть переменных глобальными. Сделать это надо как в вызывающем скрипте (функции), так и в вызываемой функции. Этот вариант работает, но делать так не нужно. Кроме обычных проблем с глобальными переменными (неконтролируемые изменения значений), это еще и замедляет выполнение функции.
Так что же нужно сделать, чтобы не только список параметров стал короче, но и выполнение функции не замедлялось?
1. Упакуем переменные в массив. Сохраним часть переменных a,b,c,d,e,f,g
в массиве args
args = [a,b,c,d,e,f,g];
Теперь в функцию передаются не отдельные переменные, а массив
f(x,y,z,args)
Проблема в том, что обращаться к таким переменным внутри функции нужно как к args(1)
, args(2)
, ..., а это неудобно. Где-то в начале функции придется поставить переименование
a=args(1);b=args(2);...
но это и лишний код и расходы на его выполнение. Следующий способ передачи данных использует сходный прием, но лишен отмеченного недостатка.
2. Упакуем переменные в структуру. Создаем из нескольких переменных структуру
earth = struct('R',398600.4415e+9,'mu',6378.137e3,'al',0.37);
В нашем случае переменные являются физическими параметрами Земли (радиус, гравитационный параметр и альбедо), хотя с точки зрения передачи данных это и не важно.
Передача переменных в функцию осуществляется через созданную структуру earth
f(x,y,z,earth)
а их использование не требует переименования
S = pi*earth.R^2;
q_abs = earth.al*q_Sun;
...
На первый взгляд кажется, что обращение к переменным стало более громоздким. Но это не так. Ведь чтобы отличать параметры Земли от параметров других планет нам все равно придется добавлять к имени частицу, указывающую на их принадлежность Земле. Например, так
S = pi*R_earth^2;
q_abs = al_earth*q_Sun;
...
Мы просто вынести "указатель" на Землю в имя структуры. Отсюда принцип эффективной передачи данных -- передаваемые параметры объединяются в смысловые группы и упаковываются в структуры.
Еще один подход к передаче данных в функцию рассмотрен здесь.
Комментарии
comments powered by Disqus