Предположим, что у меня есть эта функция:
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
.
Все ли правильно? Я упустил какое-то преимущество/недостаток? Обратите внимание, что производительность здесь является приоритетом
Зачем мне это нужно?
Что ж, прочитайте этот вопрос, чтобы узнать о нем больше. .