概括/重构代码

时间:2010-10-04 13:00:54

标签: c++ refactoring

我的代码是这样的:

if(country == china)
{
getCNData();

}

else {
getDefaultDataForallCountries();

}

现在我需要为其他国家/地区的美国增加与CN类似的逻辑。我可以选择在条件允许的情况下再添加一个国家/地区,并将其设置为

if(country ==china && country==US){
getCNandUSData();

}

else {
getDefaultDataForallCountries();


}.

1)我不太愿意选择这个解决方案,因为这不是通用的。如果明天我需要将相同的CN逻辑应用于另一个国家,请说法国。能否请您建议我如何使我的代码更好,更通用。

2)我也不满意命名约定。如果说我采用在If条件下添加US的方法,我应该将类名和函数名重构为getCNAndUSData()吗?

我不确定处理这些现有代码的正确方法是什么。 感谢您的评论。

6 个答案:

答案 0 :(得分:10)

通过实施带有strategy pattern abstract factory,可以巧妙地处理此类问题(过度使用“if”和“switch”语句)。基本上,您希望在不改变实现的情况下更改算法,并反复复制代码。

享受!

答案 1 :(得分:2)

使用枚举。

enum Country
{
    China,
    USA
};

您的代码将重构为:

switch(country)
{
        case China:
        case USA:
           getCNAndUSData () ;
           break;
        ... //Here can be another countries
        default:
           getDefaultDataForallCountries()
}

答案 2 :(得分:0)

你最有可能最好使用“开关”声明..

开关(){
case this-value:
  要执行的代码== this-value
  打破;
case-value:
  要执行的代码== that-value
  打破;
...
默认:
  要执行的代码如果不等于任何情况之后的值
  打破;
}

了解详情:http://discuss.itacumens.com/index.php?topic=22753.0#ixzz11OXV6caP

答案 3 :(得分:0)

你可以按位比较。这意味着分配每个国家:

#define China 1
#define US 2
#define France 4

然后你可以这样比较:

if (country&(US|China)) {
  // ...
}

关于你的命名问题,你可以使用像getSpecificData()这样的通用名称。虽然我不太了解你的背景。

答案 4 :(得分:0)

这是一个非常宽泛的基于LSP / Strategy Design Pattern的骨架轮廓,可以为您提供这个想法。

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(){
}

答案 5 :(得分:0)

正如所建议的那样,案例结构可以在这里使用更好。在你的情况下,代码将是

switch (country)
case China:
GetCNData();
Break;
case US:
GetUSData();
Break;
default:
GetGenericData();

如果您认为GetUSData和GetCNData相同,那么您只需从GetUSData()调用GetCNData()即可。

GetUSData()
{
GetCNData();
}

如果要使编译时独立,则使用虚拟继承。创建一个名为Country的基类,并在其中包含GetData()方法。现在通过继承并通过适当地更改GetData()方法来创建其他国家/地区类。

这也可以使用模板完成,不知道如何。