重构具有相同参数的静态成员函数
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,并将其传递给辅助函数。
我有一个静态助手 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,并将其传递给辅助函数。