2013-10-09 12 views
0

我有一大段代码可用于说一些参数的两个版本,比如说ver1和ver2。在代码库中替代多次使用if-else

版本是一个运行时间域,我打算把它作为,让我不必建立与不同的标志和同一LIB文件的代码可用于两个版本。

现在,有不同的字段适用于ver1和一些适用于ver2。

所以在多个地方的代码我必须做

if(ver1) { 
    // set fields specific to ver1 
} 
else { 
    // set fields specific to ver2 
} 

我不喜欢把这样的想法可能if语句中的代码,该代码就显得不那么难看。

此任何替代方案?

我在想一些通用的内联/宏定义,只有当传递的标志为真时才设置字段。代码

内部组织的一些细节不能发布代码的细节 -

此外,在优化方面,应不小于的if else

@edit是昂贵的。但事实上一个重要的问题是,它需要一个巨大的遗留代码,需要向后兼容升级。

将版本参数传递给每个类,以决定要设置哪个字段以及要忽略哪个字段。

+0

如何编写两个版本的函数? – billz

+0

如果您在分支中有很多副作用,并且不同版本尝试通过重构来减少分支。当你知道什么样的领域通常被设置在一起开始提取那些功能。如果可能的话常用函数,然后提取一个接口。另请参阅:重构:改进现有代码的设计 – Alex

回答

3

一种经常使用的解决方案是有两个类表示版本1和版本2,具有一个共同的基类定义与虚拟功能的接口。所以,你只能得到一个if/else,然后虚函数表负责选择正确的函数。

如果这不是一个合理的解决方案,那么if-else是最明确的方式,我会说。

+0

在我工作的场景中不可能! – Dexter

+0

@Dexter你的问题在细节上很模糊。也许你应该描述为什么它不适用于你的场景。你的场景是什么? – user694733

0

你可以很容易地使用函数来做到这一点。功能的基本目的是减少代码冗余。

#define VERSION1 25 
#define VERSION2 55 

void checkVersion(int vers) 
    { 
     switch(vers) 
     { 
     case VERSION1: 
       code_Depending_On_Version1(); 
       break; 


     case VERSION2: 
       code_Depending_On_Version2(); 
       break; 
     } 
    } 
+0

这种方法的问题是有多个字段,根据版本和代码库中的不同位置进行设置。我最终会创建一些很多功能。 – Dexter

+0

如果你的意思是你的代码写得像嵌套的if-else(就像人们在学校里做的那样),那么你真的需要重新思考你的编码方法。我的意见是为与版本1相关的代码创建一个函数,并且为版本2创建一个相同的代码。 –

0

如果它仅仅是化妆品,然后:

void blabla0(bool ver1) 
{ 
if(ver1) 
{ 
    blabla1(); 
    return; 
} 
blabla2(); // save one else and two brackets, but get a return :-(
} 

如果你总是知道在编译时的参数,然后我会使用模板

template<bool ver> blabla0() 
{ 
if(ver1) 
{ 
    blabla1(); 
    return; 
} 
blabla2(); 
} 

这是既高效(中编译器会构建两个专用版本的函数)并清除。

我忘了另一个问题:

void blabla0(bool ver1) 
{ 
ver1 ? blabla1(): blabla2(); 
} 

或者使用基础虚拟类有两个派生类专门用于每个版本,通过垫皮特森的建议。