【发布时间】:2010-03-29 17:08:44
【问题描述】:
我有以下两种方法(如您所见),除了其中一种(详见下文)外,它们的大部分语句都相似(如您所见)
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;
}
我是否可以使用任何技术将这两种方法的公共代码行移到一个单独的方法中,可以从两种变体中调用 - 或者 - 可能将这两种方法组合成一个方法?
以下是限制:
- SURFACE 和 CURVE 类来自第 3 方库,因此不可修改。 (如果有帮助,它们都来自 IDispatch)
- 还有更多类似的类(例如 FACE)可以适合这个“模板”(不是 C++ 模板,只是代码行流)
我知道以下可以(可能?)作为解决方案实施,但我真的希望有更好的解决方案:
- 我可以为这 2 个方法添加第三个参数 - 例如一个枚举 - 标识第一个参数(例如 enum::input_type_surface、enum::input_type_curve)
- 我可以传入 IDispatch 并尝试 dynamic_cast 并测试哪个强制转换为 NON_NULL 并执行 if-else 以调用正确的方法(例如 getPlaneParams() 与 get_LineParams())
以下不是限制,但由于我的队友抵抗,这是一个要求:
- 不实现继承自 SURFACE/CURVE 等的新类。(他们更愿意使用我上面提到的枚举解决方案来解决它)
【问题讨论】:
-
你没有清除
params向量。你打算用来自许多对象的参数填充它吗?也许有更好的方法来重构你的代码,这取决于你在调用 geXXXXParameters 方法之前做了什么。 -
为什么在
bool就足够时返回unsigned int? -
SafeDoubleArray的类型是什么?我怀疑这可以重构更多,但我们首先需要它。我支持@Matthieu 提出bool的动议。 -
@nick-d 好建议。我会考虑“清除”向量。如果“清除”向量保持其初始保留大小,则需要阅读(我的生产代码与此处发布的摘录略有不同)。
-
@matthieu-m 我公司设定的编码标准要求使用
unsigned int。我们遇到了各种需要提供良好错误代码的情况,并决定最好使用多值返回(而不是 2 值返回)来提供此功能。
标签: c++ refactoring