У меня есть класс разумного размера, который реализует несколько логически связанных алгоритмов (из теории графов). В качестве входа в алгоритм требуется около 10-15 параметров. Они не модифицируются алгоритмом, а используются для управления его работой. Во-первых, я объясню два варианта реализации этого. Мой вопрос - это общий способ сделать это (независимо от того, является ли он или нет одним из двух вариантов).
Мне лично не нравится передавать эти значения в качестве параметров функции, когда N
большой, особенно, пока я все еще разрабатываю алгоритм.
void runAlgorithm(int param1, double param2, ..., bool paramN);
Вместо этого у меня есть класс Algorithm
, который содержит алгоритмы, и у меня есть struct 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()
. Нет необходимости "защищать" их.