重构一个条件

时间:2017-12-13 08:28:28

标签: c++ refactoring c++14

对于unsigned int类型的a,b,c,d,e,f,g有一个条件,如下所示:

if ((a > 0) and (b < a) and (c >= d))
{
    return ((e < std::min(std::max(0, a - g), b)) and 
            (f < std::min(d, std::max(0, c - g))));
}

我正在寻找重构表达式的方法,使其更具可读性。

2 个答案:

答案 0 :(得分:1)

首先,将这种低级优化保留给您的C ++编译器。可能最近调用的GCC g++ -Wall -O2 -march=native将比public function scopeMatchingSearch($query, $string) { $query->where(function($q) use ($string) { foreach (static::searchableFields() as $field) { $q->orWhere($field, 'LIKE', '%'.$string.'%'); } }); } 更好optimize。请参阅Matt Goldbolt的CppCon2017演讲:What Has My Compiler Done for Me Lately? Unbolting the Compiler's Lid

如果您认为(在分析之后)应该手动优化此特定代码,请执行此操作并对其进行记录。但你应该首先介绍一下。

请注意各种近似timing的计算。

请记住,开发时间也有成本。大多数情况下,它们比这种低级优化更重要。因此,源代码的可读性也很重要(更好地命名变量,额外的临时值或其他注释可能很重要)。

答案 1 :(得分:1)

优化是错误的术语,但可以重写代码以找到更好的(更简化或简洁的业务)逻辑。

X < min(Y, Z)    <=>    X < Y and X < Z
X < max(Y, Z)    <=>    X < Y or X < Z            (less usefull)

然后可能的重写是

return ((e < std::min(std::max(0, a - g), b)) and 
        (f < std::min(d, std::max(0, c - g))));

return ((e < std::max(0, a - g) and e < b)) and 
        (f < d and  f < std::max(0, c - g))));

return (e < 0 or e < a - g)
       and e < b
       and f < d
       and (f < 0 or f < c - g);

根据其他限制,这可能是可以减少的。

我宁愿为难以阅读的min + max。

创建一个函数between
return e < minmax(b, a - g, 0) and 
       f < minmax(d, c - g, 0);

我之间没有这样说,因为maxmin也是可行的。

<强>

@Jarod向我指出,OP提到的所有数字都是无符号。然后

max(a - g, 0)

可能应该是

a > g ? a - g : 0