Давайте предположим, что у меня есть эта функция:
void foo (struct1 &v1, struct2 &v2, ..., structn &vn){
//do something with a subset some of the arguments...
foo1(v1, v2, ..., vn);
}
void foo1 (struct1 &v1, struct2 &v2, ..., structn &vn){
//do something with a subset some of the arguments...
foo2(v1, v2, ..., vn);
}
...
void foom (struct1 &v1, struct2 &v2, ..., structn &vn){
//do something with a subset some of the arguments...
}
Является ли хорошей практикой инкапсулировать все эти аргументы в выделенную структуру и использовать вместо этого только в качестве аргумента? Что-то вроде:
struct wrapper{
strcut1 v1;
struct2 v2;
...
structn vn;
}
void foo (wrapper & w){
//use some of w's fields
foo1(w);
}
void foo1 (wrapper & w){
//use some of w's fields
foo2(w);
}
...
void foom (wrapper & w){
//use some of w's fields
}
Я думаю, что этот подход имеет 2 преимущества:
foom
тогда я должен изменить и все остальные m-1
foo
Заголовки … кошмар. С этим методом вместо этого единственное, что нужно сделать, это добавить новое поле в wrapper
,n
(количество аргументов) и m
(количество функций) велико (скажем, 10), это означает, что мы должны скопировать m*n
адреса, которые не являются большими накладными расходами, но наверняка больше, чем m
,Все ли правильно? Я пропустил какое-то преимущество / недостаток? Обратите внимание, что производительность здесь является приоритетом
Зачем мне это нужно?
Ну читай этот вопрос, чтобы узнать больше об этом.
Это зависит от количества параметров, которые у вас есть.
В общем, обычным является инкапсуляция многих параметров в одну единственную структуру, называемую, например, «params», чтобы прототип функции не был слишком длинным.
Примером этой схемы являются Flann, кД-GeRaF (мой) и FALCONN.
Я не видел ни одного случая, чтобы параметры были честными, так что это на ваше личное мнение.
Да лучше. У вас в основном есть пакет переменных, которыми вам нужно вместе манипулировать, и которые нужно передавать вместе. Основным преимуществом является то, что, упаковав этот пакет переменных в struct
, вы даете ему имя и упрощаете вызовы функций.
Что касается производительности: ну, наверное, это не имеет значения. Да, вы передаете меньше стеков в стеке, однако это не ускорит процесс, если вызов функции не будет выполняться очень часто (= несколько миллионов раз в секунду). Если эти вызовы функций не являются частью внутреннего цикла вашего приложения (например, 99% всего написанного кода), разница в скорости не имеет значения.