Декомпозиция функции-члена
В классе есть функция-член, которая довольно длинная.Допустим, у нас есть
class Customer {
public:
void process();
...
};
Метод Процесс по своей природе длинный и состоит из пары различных шагов.Вы бы хотели, чтобы эти шаги были собственными функциями, чтобы избежать использования нескольких уровней абстракции в методе процесса.Я думал об этих различных параметрах (включая альтернативу noop):
Создание автономных функций для шагов за пределы класса.
double step_a(vector<Order> orders, double foo);
void step_b(double bar);
void Customer::proccess()
{
double foo;
...
double bar = step_a(this->orders, foo);
...
step_b(bar);
};
Проблемы: класс является менее самостоятельным-contained.Автономные функции настолько специфичны для функции процесса, что никогда не будут представлять интереса для любого другого кода, поэтому неестественно оставлять их вне класса.
Создавать приватные методы.
class Customer {
public:
void process();
private:
double step_a(double foo);
void step_b(double bar);
};
Проблемы: закрытые методы для шагов (по крайней мере, некоторые из них) вообще не будут работать ни с одним из членов класса.У них нет побочных эффектов, они только вычисляют значение из аргументов и возвращают его, поэтому им вообще не нужно быть функциями-членами класса.
Оставить Customer :: process как есть
Проблемы: функция становится длинной и может быть трудной для чтения из-за всех подробностей шагов, из-за которых трудно увидеть общую картину того, какие шаги содержит процесс.
Вопрос:
Какой самый чистый способ справиться с этим?
(Возможно, ничего из вышеперечисленного, но кое-что, о чем я не думал.)