重构具有相同参数的静态成员函数

refactoring static member functions with same parameters

我有一个静态助手 class,它有几个使用相同参数的函数:

class helper {
public:
  static double getValue(const CString &a, const CString &b, const CString &c, ... );
private:
  static double foo(const CString &a, const CString &b, const CString &c, ... );
  static bool bar(const CString &a, const CString &b, const CString &c, ... );
  static bool qux(const CString &a, const CString &b, const CString &c, ... );
  static double wad(const CString &a, const CString &b, const CString &c, ... );
  static int xyz(const CString &a, const CString &b, const CString &c, ... );
};

像这样使用它:

double value = helper::getValue(a, b, c, k, ...);

getValue() 将调用 foo(),后者将调用 bar()qux()wad()
他们都需要相同的a,b,c数据集

如你所见,有很多重复的参数,看起来有点乱。

有什么重构的方法吗?

是的,创建一个包含所有参数作为成员的 class/struct Params。让您的静态函数接受 Params 的实例而不是所有参数。您的代码将如下所示:

struct Params {
  const CString &a;
  const CString &b;
  const CString &c;
   ...
}

class helper {
public:
  static double getValue(const Params & p);
private:
  static double foo(const Params & p);
  static bool bar(const Params & p);
  static bool qux(const Params & p);
  static double wad(const Params & p);
  static int xyz(const Params & p);
};

这样你只需要创建一个 Params 对象一次并传递它。

一个 可能的解决方案是 getValue return 一个内部 class 实例,它可以转换为 double.

像这样:

class helper
{
public:
    class helper_internal_class
    {
        friend class helper;

    public:
        operator double() const
        {
            return foo();
        }

    private:
        helper_internal_class(const CString &a, const CString &b, const CString &c, ...)
            : a_(a), b_(b), c_(c), ...
        {}

        CString a_;
        CString b_;
        CString c_;
        ...

        double foo() const;
        {
            // Do something more...
            return bar();
        }
        double bar() const;
        ...
    };

    static helper_internal_class getValue(const CString &a, const CString &b, const CString &c, ...)
    {
        return helper_internal_class(a, b, c, ...);
    }
};

它有点样板,但至少你不必一直传递参数。

如果更好?这取决于你。 :)

如果您想对带有可变参数列表的函数执行此操作,则无法直接执行此操作。您不能将可变参数列表传递给另一个具有可变参数列表的函数。

相反,您可以声明一个参数类型为 va_list 的函数,在具有可变参数列表的函数中使用 va_start 和 va_end 来创建一个 va_list,并将其传递给辅助函数。