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++代码中使用<代码>定义< <代码>。谢天谢地,我不是和你坐在同一个房间里,我会打你的头。