编译器如何处理已部分应用的布尔参数?

Sol*_*lma 3 f# if-statement boolean

我读了一篇关于boolean函数参数的有趣文章:

https://medium.com/compileswift/clean-code-the-curse-of-a-boolean-parameter-c237a830b7a3

作者认为,在许多情况下,最好将具有boolean参数的函数拆分为两个.这是因为使用布尔参数会增加cyclomatic complexity代码.

请考虑以下简单功能:

let fbool (b: bool) (x: int) =
    if b then x
    else -x
Run Code Online (Sandbox Code Playgroud)

接下来,定义从部分应用程序定义的函数,如下所示:

let ftrue x = fbool true x
Run Code Online (Sandbox Code Playgroud)

或者等价的

let ftrue = fbool true
Run Code Online (Sandbox Code Playgroud)

F#编译器是否足够聪明以完成作者推荐的内容,即ftrue上面定义的函数不包含if语句,因此不会影响圈复杂度?或者它是否包含一个if声明,但总是选择true分支?

Jus*_*mer 5

F#编译器不够智能,无法消除这样的分支.一般来说,.NET中的编译器只应用很少的优化,希望抖动能够优化它们.

如果你使fbool内联函数ftrue最终如下:

public static int ftrue(int v)
{
    bool flag = true;
    if (flag)
    {
        return v;
    }
    return -v;
}
Run Code Online (Sandbox Code Playgroud)

这里编译器"显然"应该消除分支,但它不会.

但是,您可能很幸运,代码复杂性工具意识到其中一个分支永远不会被占用,也不会将此测试添加到CC分数中.