2017-08-10 106 views
0

我正在开发一个最初用C编写的项目。几年前,只做了一些小的更改,源代码在C++下编译。项目确实是巨大的,不幸的是它看起来像这样:如果C++中的分支太多

#define DEVICE_A 0 
#define DEVICE_B 1 
.. 
#define DEVICE_N 50 

#define COMPANY_A 0 
#define COMPANY_B 1 
.. 
#define COMPANY_N 50 

//and now the interesting part in other files: 
if(giCompany == COMPANY_A || giCompany == COMPANY_B || 
giCompany != COMPANY_C && giDevice == DEVICE_A) 
{ 
//... do something 
} 
else 
{ 
    if(giCompany == COMPANY_D) 
    { 
    // so something different 
    } 
}// and so on ... 

什么是对付这么多,如果最好的办法 - 别人的在C++?我的例子非常小,在实际的代码中更糟糕,如果分支很多,分析它就需要很长时间......项目太大了,我不会去触摸现有的代码,但是添加了那么一团糟就像现在我不想做的那样。我开始使用多态(每个接口设备,和设备必须实现自己的方法,而不是创建另一个if/else分支),它看起来好多了。但是我想问一下,在C++中如何处理这样的if/else问题的常用方法是什么?

+0

你的问题是什么?分支机构的数量是多少,还是条件的复杂性?如果每个分支都有它的代码,你不会摆脱它们。这不是真正的C++问题,而是软件设计的问题。尝试语义分组和分离代码。如果这是你不喜欢的条件,你可以创建一个封装这些的类。 – Knowleech

+1

'giCompany ==!COMPANY_C'我有一个偷偷摸摸的怀疑,这不符合你的想法。你的意思是'giCompany!= COMPANY_C'? – Borgleader

+0

@Knowleech,他们俩都很难保持...... – wair92

回答

0

使用的switch-case:

switch(giCompany) 
{ 
    case COMPANY_A: 
    case COMPANY_B: 
    { 
     // Stuff 
     break; 
    } 

    case COMPANY_C: 
    { 
     // Stuff 
     break; 
    } 

    // ... 
} 

如果你做额外的检查,用第二个变量(如giDevice),它会变得有点棘手

0

您可以创建一个std::vector拿着2个函数:一个比较(如同语句头),一个用于动作,如果所述比较函数返回true

例如:

std::vector<std::pair<std::function<bool()>, std::function<void()>>> operations = 
    { 
     { 
     [=] 
      { 
      return giCompany == COMPANY_A || giCompany == COMPANY_B || 
        giCompany != COMPANY_C && giDevice == DEVICE_A; 
      }, 
     [&] { /*... do something */ } 
     }, 
     { 
     [=] {return giCompany == COMPANY_D;}, 
     [&] { /* do something different */ } 
     }, 
    }; 

for (auto const& pair: operations) 
    { 
    if (pair.first()) 
     { 
     pair.second(); 
     } 
    } 

Live Demo


,或者,如果所有的这些if-else案件上giCompany仅仅依靠,和giDevice,你可以将它们作为一个参数传递给函数子:

std::vector<std::pair<std::function<bool(int, int)>, std::function<void()>>> operations = 
    { 
     { 
     [] (int company, int device) 
      { 
      return company == COMPANY_A || company == COMPANY_B || 
        company != COMPANY_C && device == DEVICE_A; 
      }, 
     [&] { /*... do something */ } 
     }, 
     { 
     [] (int company, int device) {return company == COMPANY_D;}, 
     [&] { /* do something different */ } 
     }, 
    }; 

for (auto const& pair: operations) 
    { 
    if (pair.first (giCompany, giDevice)) 
     { 
     pair.second(); 
     } 
    } 

Live Demo.


由于所有的函数都在vector中 - 它们将被迭代,并在完全相同的ord中进行评估呃,因为他们会在if-else树上。但是,如果你想指定,那满足一些条件,迭代应该停止,你可以添加一个输出参数:

std::vector<std::pair<std::function<bool(int, int, bool&)>, std::function<void()>>> operations = 
    { 
     { 
     [] (int company, int device, bool& stop) 
      { 
      stop = true; 
      return company == COMPANY_A || company == COMPANY_B || 
        company != COMPANY_C && device == DEVICE_A; 
      }, 
     [&] { /*... do something */ } 
     }, 
     { 
     [] (int company, int device, bool& stop) 
      { 
      stop = false; 
      return company == COMPANY_D; 
      }, 
     [&] { /* do something different */ } 
     }, 
    }; 

for (auto const& pair: operations) 
    { 
    bool stop = false; 
    if (pair.first (giCompany, giDevice, stop)) 
     { 
     pair.second(); 
     } 

    if (stop) 
     { 
     break; 
     } 
    }