C++ 概括/重构代码
我的代码是这样的:C++ 概括/重构代码,c++,refactoring,C++,Refactoring,我的代码是这样的: if(country == china) { getCNData(); } else { getDefaultDataForallCountries(); } 现在,我需要为其他一些国家(比如美国)添加与CN类似的逻辑。我可用的选项是在if条件下再添加一个国家/地区签入,并使其类似 if(country ==china && country==US){ getCNandUSData(); } else { getDefaultDataForallC
if(country == china)
{
getCNData();
}
else {
getDefaultDataForallCountries();
}
现在,我需要为其他一些国家(比如美国)添加与CN类似的逻辑。我可用的选项是在if条件下再添加一个国家/地区签入,并使其类似
if(country ==china && country==US){
getCNandUSData();
}
else {
getDefaultDataForallCountries();
}.
1) 不知何故,我不愿意采用这种解决方案,因为这不是通用的。如果明天我需要将同样的CN逻辑应用到另一个国家,比如法国,该怎么办。你能建议我如何使我的代码更好、更通用吗
2) 此外,我对命名约定感到不舒服。如果说我采用在If条件中添加我们的方法,我是否应该将类名和函数名重构为getCNAndUSData()
在这里,我不确定处理此类现有代码的正确方法是什么。
感谢您的评论。您最好使用“切换”语句 开关(){
大小写此值:
如果==此值,则执行代码
中断;
该值的大小写:
如果==该值,则执行代码
中断;
…
默认值:
如果不等于任何情况下的值,则执行代码
中断;
} 阅读更多信息:这类问题(过度使用“if”和“switch”语句)可以通过使用实现来巧妙地处理。基本上,您希望在不改变实现和反复复制代码的情况下更改算法 享受吧 使用枚举
enum Country
{
China,
USA
};
您的代码将被重构为:
switch(country)
{
case China:
case USA:
getCNAndUSData () ;
break;
... //Here can be another countries
default:
getDefaultDataForallCountries()
}
你可以按位比较。这意味着为每个国家分配一个位:
#define China 1
#define US 2
#define France 4
然后你可以这样比较:
if (country&(US|China)) {
// ...
}
关于命名问题,您可以使用一个通用名称,如getSpecificData()。虽然我不太了解你的背景。这里有一个非常广泛的框架大纲,基于/应该给你一个想法
struct country{
void getdata(){return dogetdata();}
virtual ~country() = 0;
private:
virtual void dogetdata() = 0;
};
country::~country(){}
void country::dogetdata(){
// logic for default data for all countries
}
struct china : country{
private:
void dogetdata(){return ;}
public:
~china(){}
};
struct xyz : country{
private:
void dogetdata(){return ;}
public:
~xyz(){}
};
void get(country *p){
p->getdata();
}
int main(){
}
正如所建议的那样,可以在这里使用case结构以获得更好的性能。在您的情况下,代码将是
交换机(国家/地区)
案例中国:
GetCNData()
中断
案例美国:
GetUSData()
中断
默认值:
GetGenericData()
如果您认为GetUSData和GetCNData是相同的,那么您只需从GetUSData()调用GetCNData()
GetUSData()
{
GetCNData();
}
如果您想拥有编译时独立性,那么就使用虚拟继承。创建一个名为Country的基类,并在其中包含GetData()方法。现在通过继承该类并适当更改GetData()方法来创建其他country类
这也可以使用模板完成,但不确定如何完成 我怀疑(国家==中国和国家==美国)是否可能评估为真。。。当然,除非美国和中国是平等的:Pdogetdata()需要在基类中得到保护(从技术上讲,public也可以工作,但我肯定这不是你想要的)。@gregg:是的,如果我想让我的派生类调用它,它可以得到保护。这基本上取决于其他设计考虑。例如,请不要考虑在C++代码中使用<代码>定义< <代码>。谢天谢地,我不是和你坐在同一个房间里,我会打你的头。