建议重构以下形式的if语句?

时间:2019-04-09 14:21:27

标签: c++ if-statement refactoring theory

我正在尝试使其尽可能通用。假设在if语句中,我正在检查某个布尔表达式A是否为真。假设在某些情况下,A为真,A.a和A.b是互斥的。对于另一个布尔表达式B同样如此。然后,请考虑以下代码:

if (A) {
  if (A.a) {
    somethingSpecificToAa();
    foo();
  }
} else if (B) {
  if (B.a) {
    somethingSpecificToBa();
    foo();
  }
} else {
    foo();
}

在我的实际代码中,foo()不是单个函数,而是多行长长的代码。多次重复它们对我来说似乎很臭,所以我认为必须进行一些重构。

由于在以下情况下执行了foo()

  • A.a是真的
  • B.a是真的
  • A和B都不正确

我想到了以下内容:

if (A.a) {
  somethingSpecificToAa();
} else if (B.a) {
  somethingSpecificToBa();
}

if (A.a || B.a || !(A || B)) {
  foo();
}

应该具有相同的行为。这是最好的方法吗?请注意,第二个示例的第二个if语句中的条件实际上实际上是非常长的,这就是为什么我的代码仍然看起来像第一个示例的原因(我讨厌在多行中分解单个if。)我们还考虑过要制作一个返回bool的{​​{1}}的lambda,并将该lambda插入第二个if语句中。另外,我可以保留第一个示例的结构,但是用一个{A.a || B.a || !(A || B))lambda替换每个foo()的许多行,尽管我不确定这样做能解决气味。

在这一点上,我是否在过度设计,正在考虑使用lambda?哪种方法最适合维护干净的代码?

编辑:似乎我已经使它成为通用的。我正在处理STL容器,而不是我自己的类,一个更“准确”的示例将是:

void

2 个答案:

答案 0 :(得分:0)

由于其中包含一些通用代码,为什么不将其分解为一个函数?你可能会有类似的东西

template<typename T, typename F>
bool doSomething(T const& t, F f)
{
    if (t && t.a)
    {
        f();
        foo();
    }

    return static_cast<bool>(t);
}

并像使用它

if (!doSomething(A, &somethingSpecificToAa) && !doSomething(B, &somethingSpecificToBa))
{
    foo();
}

答案 1 :(得分:0)

根据您最近的评论,这里有一些伪代码可能与您的用例相符。

Element* element=nullptr;

if(vectorA.contains(X)){
   element = vectorA.get(X);
}else if(setB.contains(X)){
   element = setB.get(X);
}

if(element != nullptr && element->a){
   something(element);
}

if(element == nullptr || element->a){
    foo();
}