c++ - 重构以下两个C++方法,移出重复代码

标签 c++ refactoring

我有以下两种方法(如您所见)在其大部分语句中都是相似的,除了一个(详见下文)

unsigned int CSWX::getLineParameters(const SURFACE & surface, vector<double> & params)
{
    VARIANT varParams;

    surface->getPlaneParams(varParams); // this is the line of code that is different

    SafeDoubleArray sdParams(varParams);

    for( int i = 0 ;  i < sdParams.getSize() ; ++i )
    {
        params.push_back(sdParams[i]);
    }

    if( params.size() > 0 ) return 0;
    return 1;
}

unsigned int CSWX::getPlaneParameters(const CURVE & curve, vector<double> & params)
{
    VARIANT varParams;

    curve->get_LineParams(varParams); // this is the line of code that is different

    SafeDoubleArray sdParams(varParams);

    for( int i = 0 ;  i < sdParams.getSize() ; ++i )
    {
        params.push_back(sdParams[i]);
    }

    if( params.size() > 0 ) return 0;
    return 1;
}

是否有任何技术可用于将两种方法的公共(public)代码行移出到一个单独的方法中,该方法可以从两种变体中调用 - 或者 - 可能将两种方法组合成一个方法?

以下是限制:

  1. 类 SURFACE 和 CURVE 来自第 3 方库,因此不可修改。 (如果有帮助,它们都派生自 IDispatch)
  2. 还有更多类似的类(例如 FACE)可以适合这个"template"(不是 C++ 模板,只是代码行的流动)

我知道以下可以(可能?)作为解决方案实现,但我真的希望有更好的解决方案:

  1. 我可以向这 2 个方法添加第三个参数 - 例如枚举 - 标识第一个参数(例如 enum::input_type_surface、enum::input_type_curve)
  2. 我可以传入 IDispatch 并尝试 dynamic_cast<> 并测试哪个转换为 NON_NULL 并执行 if-else 以调用正确的方法(例如 getPlaneParams() 与 get_LineParams())

以下不是限制,但由于我的队友反对而成为要求:

  1. 不实现继承自 SURFACE/CURVE 等的新类(他们更愿意使用我上面提到的枚举解决方案来解决它)

最佳答案

我想到了几个想法,但这是我认为最好的:

namespace detail
{
    void getParameters(const SURFACE& surface, VARIANT& varParams)
    {
        surface->getPlaneParams(varParams);
    }

    void getParameters(const CURVE& curve, VARIANT& varParams)
    {
        curve->get_LineParams(varParams);
    }
}

template <typename T>
unsigned int getParameters(const T& curve, vector<double> & params)
{
    VARIANT varParams;
    detail::getParameters(curve, varParams);

    SafeDoubleArray sdParams(varParams);
    for( int i = 0 ;  i < sdParams.getSize() ; ++i )
    {
        params.push_back(sdParams[i]);
    }

    return params.size() != 0;
}

您所做的是将获取参数的任务委托(delegate)给其他一些重载的函数。只需为您拥有的每种不同类型添加类似的功能。 (请注意,我简化了您的返回声明。)

关于c++ - 重构以下两个C++方法,移出重复代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2539812/

相关文章:

c++ - 调用 numDeriv :hessian() with multiple-parameter-objective-function in Rcpp

c++ - 在二叉树中找到唯一元素

javascript - 从 Backbone 迁移到 AngularJS——有多难?

java - 如何获取两个 ZonedDateTime 之间的时间差并像 "4 hours, 1 minute, 40 seconds ago"一样漂亮地打印它?

支持头文件重构的C++ IDE

c++ - SFML 2.0 – 用 Sprite vector 绘图

c++ - 为 2 个不同的文件(输入和输出)运行相同的脚本 ???/ROOT/C++

c++ - 是否有一个库可以在 C++ 中创建一组具有相同名称和索引的目录?

java - 如何避免对包装类上实现的每个方法的包装对象进行空检查

php - 在 PHP foreach 循环之外访问变量