Передача переменных VS2008 - компоненты struct против struct - преимущества / недостатки? - PullRequest
4 голосов
/ 21 июня 2011

Я действительно надеюсь, что это не один из тех супер базовых вопросов.

В любом случае, у меня есть структура с 47 компонентами, и я вызываю различные функции, которые используют от 3 до 10 этих компонентов одновременно.

Лучше ли вызывать функцию как:
foo(pParam->variable1, pParam->variable2, pParam->variable3)
или foo(pParam) и затем в функции используйте pParam->variable1; pParam->variable2; pParam->variable3;?

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 21 июня 2011

Я был в похожей ситуации. Передайте каждый компонент отдельно. Это проясняет вызывающим сторонам, какие значения требуются, и проясняет разработчикам, какие значения доступны.

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

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

Передача всех параметров по отдельности дает всем понять, что на самом деле является контрактом, и делает явным добавление новых параметров.

3 голосов
/ 21 июня 2011

Вы должны передать структуру по ссылке, чтобы вам не нужно было копировать все значения:

void foo(mySturct pParam); //Here the struct will be copy constructed.. relatively large overhead

void foo(Val1 param1, Val2 param2, Val3 param3); // 3 parameters passed by value, the value will be copied.

void foo(mySturct &pParam); //Only the reference to the structure is passed. Single pointer size value is passed.

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

2 голосов
/ 21 июня 2011

Я думаю, что лучше подумать об архитектуре.Структура с 47 атрибутами, передаваемая различным функциям, которые не используют все из них, выглядит как Модель Anemic Domain .Вы должны разбить его на классы, каждый класс содержит методы, которые работают только с данными в классе.Таким образом, вы избегаете как передачи структуры (вы получаете ее бесплатно с классами), так и проблем с масштабированием вашей программы.

...