【问题标题】:refactoring static member functions with same parameters重构具有相同参数的静态成员函数
【发布时间】:2015-05-05 23:36:04
【问题描述】:

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

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数据集。

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

有没有办法重构它?

【问题讨论】:

    标签: c++ class static-methods


    【解决方案1】:

    是的,创建一个包含所有参数作为成员的类/结构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 对象并传递它。

    【讨论】:

      【解决方案2】:

      一个可能的解决方案是让getValue 返回一个内部类实例,该实例可以转换为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, ...);
          }
      };
      

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

      如果它更好?随你(由你决定。 :)

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-31
          • 2015-09-27
          • 2013-02-05
          • 1970-01-01
          • 2011-08-15
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多