Как определяется, в какую сторону должно быть обобщение?
То есть, при решении конкретной задачи как определить, что должно быть параметром, а что — неизменяемой частью.
Например, есть задача «получить сумму от 1 до 100».
Самым быстрым решением будет
class Sum1_100
{
int run() { return 5050; }
}
но в этом случае программист поработал за компьютер. Тривиальное решение с расчётом компьютером
class Sum1_100
{
int run()
{
int res = 0;
for(int i=1; i<=100; i++) res+=i;
return res;
}
}
Но получив такую задачу, почти всегда решение выглядит примерно так:
class Sum1_n
{
int n;
Sum1_n(int _n = 100) { n = _n; };
int run()
{
int res = 0;
for(int i=1; i<=n; i++) res+=i;
return res;
}
}
на случай, если потребуется не до 100, а до какого-то другого числа.
И вот здесь у меня вопрос: почему в «получить сумму от 1 до 100» большинство параметризуют именно 100? Посему не «сумму» (тогда параметром будет операция от 100 элементов) или не «от 1 до 100» (тогда параметром будет некая последовательность). Или вообще не всё сразу? С вызовом типа
auto_ptr<Op> op = new GenOp(operator+, 100);
auto_ptr<Seq> seq = new Seq(1, 100);
auto_ptr<Apply> = new GenApply(op, seq);
result = Main->run();
Как для произвольного алгоритма определяется, что является параметром, а что неизменяемой частью?