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
分支?
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分数中.