我的代码是这样的:
if(country == china)
{
getCNData();
}
else {
getDefaultDataForallCountries();
}
现在我需要为其他国家/地区的美国增加与CN类似的逻辑。我可以选择在条件允许的情况下再添加一个国家/地区,并将其设置为
if(country ==china && country==US){
getCNandUSData();
}
else {
getDefaultDataForallCountries();
}.
1)我不太愿意选择这个解决方案,因为这不是通用的。如果明天我需要将相同的CN逻辑应用于另一个国家,请说法国。能否请您建议我如何使我的代码更好,更通用。
2)我也不满意命名约定。如果说我采用在If条件下添加US的方法,我应该将类名和函数名重构为getCNAndUSData()吗?
我不确定处理这些现有代码的正确方法是什么。 感谢您的评论。
答案 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()方法来创建其他国家/地区类。
这也可以使用模板完成,不知道如何。