У меня есть класс разумного размера, который реализует несколько логически связанных алгоритмов (из теории графов).В качестве входных данных для алгоритма требуется около 10-15 параметров.Они не модифицируются алгоритмом, но используются для управления его работой.Сначала я объясню два варианта реализации этого.Мой вопрос заключается в том, что является обычным способом сделать это (является ли это одним из двух вариантов или нет).
Мне лично не нравится передавать эти значения в качестве параметров функции, когда N
большой, особенно когда я все еще разрабатываю алгоритм.
void runAlgorithm(int param1, double param2, ..., bool paramN);
Вместо этого у меня есть класс Algorithm
, который содержит алгоритмы, и у меня есть структура AlgorithmGlobals
, которая содержит эти параметры.Я либо передаю эту структуру:
void runAlgorithm(AlgorithmGlobals const & globals);
, либо добавляю в класс общедоступный экземпляр AlgorithmGlobals:
class Algorithm {
public:
AlgorithmGlobals globals;
void runAlgorithm();
}
Тогда в другом месте я бы использовал его так:
int main() {
Algorithm algorithm;
algorithm.globals.param1 = 5;
algorithm.globals.param2 = 7.3;
...
algorithm.globals.paramN = 5;
algorithm.runAlgorithm();
return 0;
}
Обратите внимание, что конструктор AlgorithmGlobals
определяет хорошие значения по умолчанию для каждого из параметров, поэтому необходимо указывать только параметры со значениями, отличными от значений по умолчанию.
AlgorithmGlobals
не делаются закрытыми, посколькуони могут быть свободно изменены до вызова функции runAlgorithm()
.Нет необходимости «защищать» их.