代码之家  ›  专栏  ›  技术社区  ›  rublow

重构条件[关闭]

  •  -4
  • rublow  · 技术社区  · 8 年前

    无符号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 回复  |  直到 8 年前
        1
  •  1
  •   Joop Eggen    8 年前

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

    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);
    

    根据其他约束,这可能是可以简化的。

    我宁愿做一个函数 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
    
        2
  •  1
  •   Basile Starynkevitch    8 年前

    首先 将这种低级优化留给您的C++编译器 . 可能是最近 GCC 调用为 g++ -Wall -O2 -march=native optimize 比你做的更好。参见Matt Goldbolt的CppCon2017演讲: What Has My Compiler Done for Me Lately? Unbolting the Compiler's Lid .

    如果您认为(在分析之后)应该手动优化这段特定的代码,那么就这样做并编写文档。但你应该先介绍一下。

    注意各种近似值 timing 计算的数量。

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