Более чистый способ передать множество параметров многим функциям в сценарии без перехода к объектно-ориентированной структуре кода? - PullRequest
1 голос
/ 06 августа 2020

Я ищу совет по стилю / передовой практике. Я часто пишу сценарии, в которых нужно определить много (несколько десятков) параметров в начале. Затем эти параметры используются многими функциями сценария. Минимальный упрощенный пример может выглядеть примерно так:

params.var1 = 1;
params.var2 = 10;
params.var3 = 100;
params.var4 = 1e3;

result1 = my_func1(params);
result2 = my_func2(params);

Теперь я не хочу передавать много входных данных в каждую функцию, поэтому я не хочу делать что-то вроде result1 = my_func1(var1,var2,var3,var4,...). Поэтому я всегда обнаруживаю, что делаю каждую переменную полем структуры (например, params), а затем передаю только эту структуру в каждую функцию, как указано выше. Структура не изменяется функциями, только параметры используются для дальнейших вычислений.

Тогда одна из функций может выглядеть так:

function result = my_func1(params)

var1 = params.var1;
var2 = params.var2;
var3 = params.var3;
var4 = params.var4;

result = var1.^2 + var2.^2 -var3.^3 + var4;

end

Теперь, потому что я не хотите ссылаться на каждую переменную в функции как params.var1, et c. (чтобы сохранить выражение для result как можно более ясным), я сначала делаю всю эту распаковку в начале, используя var1 = params.var1.

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

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Я бы просто оставил распаковку. Вызовите struct params что-нибудь короче внутри функции, чтобы свести к минимуму беспорядок:

function result = my_func1(p)
result = p.var1.^2 + p.var2.^2 - p.var3.^3 + p.var4;
end

Я бы продолжал называть его params в другом месте, чтобы вам не приходилось иметь дело с crypti c имена.

1 голос
/ 06 августа 2020

Вы можете определять постоянные функции:

function out = var1
  out = 1; 
end
function out = var2
  out = 10; 
end

function result = my_func1
  result = var1.^2 + var2.^2;
end

В зависимости от вашего фактического приложения вы можете передавать массив чисел:

var = [var1 var2 var3 var4]; 
my_func1(var);

my_func1(var1,var2,var3,var4,...) на мой взгляд предпочтительнее, чем передача структуры .

...