gpt4 book ai didi

c# - 如何通过适当的编译器优化使代码更具可读性?

转载 作者:太空宇宙 更新时间:2023-11-03 17:15:30 25 4
gpt4 key购买 nike

代码被更频繁地阅读然后被更新。当编译器可以优化以获得最佳执行时,编写更具可读性的代码比编写功能强大且令人讨厌的代码要好。

例如,请看下面的代码 - 这段代码可以通过组合嵌套的 if 语句来压缩,但是在我们保持代码的可读性的同时,编译器是否不会优化这段代码以实现最佳执行?

// yeild sunRays when sky is blue.
// yeild sunRays when sky is not blue and sun is not present.
if (yieldWhenSkyIsBlue)
{
// if sky is blue and sun is present -> yeild sunRaysObjB.
if (sunObjA != null)
{
yield return sunRaysObjB;
}
else
{
// do not yield ;
}
}
else
{
// if sky is not blue and sun is not present -> yeild sunRaysObjB.
if (sunObjA == null)
{
yield return sunRaysObjB;
}
}

与这样的东西相反:

// yeild sunRays when (sky is blue) or (sun is not present and sky is blue).
// (this interpretation is a bit misleading as compared to first one?)
if(( sunObjA == null && yieldWhenSkyIsBlue ==false) || (yieldWhenSkyIsBlue && sunObjA != null) )
{
yield return sunRaysObjB;
}

阅读第一个版本可以更好地描述用例,以便将来进行增强\更新?代码的第二个版本更短,但阅读它并没有使用例变得非常明显,或者是吗?除了简洁的代码之外,第二种情况还有其他优点吗?

更新 #1:是的,它在两种情况下都返回 ObjB,但根据条件它可能根本不会产生。所以该策略决定何时屈服,何时不屈服。 (可读性差的另一个原因)

更新#2:更新为网站更好的例子。从 stripplingWarrior 复制语法

更新#3:更新了“当太阳出来并且天空是蓝色的时候你期望发生什么”。

最佳答案

我认为第二个代码示例更具可读性,并且具有非常优化的优势。

大多数程序员会发现此逻辑流程显而易见且自然:如果 ObjA 为 null,或者如果它不为 null 并且设置了 howtoYieldFalg,您将返回 ObjB。

但是如果我必须在让这样的代码更具可读性和优化它之间做出选择,我会首先让它变得可读。只有当我发现它是瓶颈的根源时,我才会费心去优化它。在这种特殊情况下,我几乎可以保证您对 yield return 的使用会比对条件的次优评估引入更多的开销。

更新

再看看您的代码示例:它们在逻辑上并不等价。当太阳出来并且天空是蓝色的时候,你期望会发生什么?在这种情况下,第二个代码示例正确地允许阳光照射,而第一个示例则不允许。

在第一种情况下很容易引入一个 bug,而很多人这么长时间都没有发现,这一事实应该足以证明第二种方法更好。所有这些嵌套的 if/else 语句都很难保持直线,即使对于有经验的程序员也是如此。简单的 bool 逻辑更容易保持直截了当,尤其是当您使用赋予它意义的变量名时。

更新2

基于进一步的解释,并发挥一点创意,我将建议一种使用注释和变量名来提高清晰度的方法:

    /* Explanation: We live on a strange planet where the sun's
* rays can shine if the sky is blue while the sun is out,
* or if the sky is not blue and there is no sun. */
bool sunIsPresent = sunObjA != null;
if ((skyIsBlue && sunIsPresent) ||
(!skyIsBlue && !sunIsPresent))
{
yield return sunRaysObjB;
}

关于c# - 如何通过适当的编译器优化使代码更具可读性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9826440/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com