Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这是一种糟糕的做法吗?_C#_Performance_Xna - Fatal编程技术网

C# 这是一种糟糕的做法吗?

C# 这是一种糟糕的做法吗?,c#,performance,xna,C#,Performance,Xna,有时,我发现自己编写了一个bool方法,如下所示: public bool isRunning() { if (!(move == Moving.None) && staminaRegan == true) { if (keyState.IsKeyDown(Keys.Space)) { EntityAnimation.interval = 10;

有时,我发现自己编写了一个bool方法,如下所示:

public bool isRunning()
    {
        if (!(move == Moving.None) && staminaRegan == true)
        {
            if (keyState.IsKeyDown(Keys.Space))
            {
                EntityAnimation.interval = 10;
                return true;
            }
            else
            {
                EntityAnimation.interval = 65;
                return false;
            }
        }
        else 
        {
            EntityAnimation.interval = 65;
            return false;
        }
    }
(顺便说一句,这是XNA)正如你所看到的,我有一个bool isRunning,其中我做了一个if语句,其中我检查(玩家正在移动)&&(恢复耐力,当耐力达到小于6.0f的值时设置为false) 然后我只需检查是否按下了空格键,如果是,则我的动画速度更快(间隔越小,精灵表更改越快),然后它发送真值,这意味着播放器正在运行,否则我不会导致空格键未按下

然后我必须在第一个if语句之外重复这个'else'代码,这样它会发送一个消息,如果玩家没有移动或者他的耐力Regan为false,那么玩家就没有跑步


所以我只是想知道这种bool方法是否被认为是一种不好的做法(在嵌套if中重新运行true和false值,然后在嵌套if外部返回false并重复相同的代码)

我喜欢这种风格,我也用它。首先,您可以更轻松地读取代码,其次,它具有调试优势,因为您可以为个别情况设置断点。否则,您将需要使用断点条件。

在一个方法中有一个return语句是一个很好的做法。有些人对此争论不休,但这是一种观点

通过删除不必要的代码使if语句清晰也是一种良好的做法:

public bool isRunning()
{
    bool result = false;
    if (move != Moving.None && staminaRegan)
    {
        if (keyState.IsKeyDown(Keys.Space))
        {
            EntityAnimation.interval = 10;
            result = true;
        }
        else
        {
            EntityAnimation.interval = 65;
        }
    }
    else
    {
        EntityAnimation.interval = 65;
    }

    return result;
}

您可以按如下方式重写代码;那么代码就不会重复了:

public bool isRunning()
{
    if (move != Moving.None && staminaRegan && keyState.IsKeyDown(Keys.Space))
    {
        EntityAnimation.interval = 10;
        return true;
    }
    else
    {
        EntityAnimation.interval = 65;
        return false;
    }
}
或者,如果您不需要冗余的
else

public bool isRunning()
{
    if (move != Moving.None && staminaRegan && keyState.IsKeyDown(Keys.Space))
    {
        EntityAnimation.interval = 10;
        return true;
    }

    EntityAnimation.interval = 65;
    return false;
}

我会考虑将一个命名布尔函数引入到一个自文档中,并将代码< > StAMaReaGIN <代码>改为<代码> STAMIAISEIGATION < /COD>

public bool isRunning()
{
    bool isMovingQuickly = (move != Moving.None) && staminaIsRegenerating && keyState.IsKeyDown(Keys.Space);

    if (isMovingQuickly)
        EntityAnimation.interval = 10;
    else
        EntityAnimation.interval = 65;

    return isMovingQuickly;
}
但是,最重要的是,您应该重命名该方法,以便更准确地描述它所做的工作:

public bool CheckIfRunningAndSetAnimationInterval()
这种方法有副作用,这就是为什么它是一种不好的做法:

当查看方法的签名时,我们只希望得到
true
/
false
答案,仅此而已。但是,该方法会更改实例的状态:


我认为我们是为人(其他开发人员)编写代码的,当然是机器执行代码,但开发人员80%的工作是阅读代码。

基于此,我认为读取流必须与执行代码流完全相同——这就是为什么我认为multiply
return
语句不是一件坏事,甚至比方法底部只有一个return语句更好

我同意有一个返回语句,它在底部,看起来干净多了。由于您最初已经将结果设置为false,因此不需要在方法中进一步重置,从而增加可读性。在方法中使用一条return语句是一种很好的做法。强制将代码装配到与实际执行的逻辑不匹配的特定模式中是不好的。是的,只有一份回报声明是一种很好的做法,我工作的大多数公司都要求这样做。代码更具可读性,但更重要的是更好地维护。我已经看到人们搜索了几个小时,为什么在方法底部的retun语句之前添加的logmethod没有被执行。为什么我不应该更改bool方法中的一些(其他类-公共静态变量)值,在将true或false返回bool://之前,我只是更改了一些内容,因为每个方法只应该做一件事。您应该使一个方法正在运行,并使一个方法调整间隔。然后,如果您希望(所有这些)没有意外,您可以进行另一个方法CheckRunning和AdjustInterval!编译器应该识别多个return语句,并且应该给出一个错误。这是如此难以阅读,是历史上最大的漏洞供应商programming@GuidoG:您是否有任何参考资料支持您的论点,即多个返回语句是“编程历史上最大的bug供应商”。我经常看到复杂、复杂的代码,在尝试实现单个返回语句时会引入错误-如果有多个返回语句,代码会简化得多,并且更易于维护。如果方法一开始只做一件事,那么我们就不会有乘法返回语句的问题了。@PaulF曾经读过每一本关于结构化编程的书。在一个方法中有多个出口被认为是不好的做法,在我看来,现在仍然是这样。是的,结构化编程很古老,但oop的灵感来自it@GuidoG:关于SESE是否是好的/坏的实践,以及它是否仍然适用于许多更现代的语言,有很多争论-我只是想阅读有关它是“编程历史上最大的bug供应商”的任何信息。
 public bool isRunning()
  ...
  if (!(move == Moving.None) && staminaRegan == true)
    {
        if (keyState.IsKeyDown(Keys.Space))
        {
            EntityAnimation.interval = 10; // <- Aaa! The interval is changed 
            return true;
        }
  ...
 // No side effect: just answer is running or not
 public bool IsRunning {
   get {
     return (move != Moving.None) && staminaRegan && KeyState.IsKeyDown(Keys.Space);
   }
 }

 // Put the right interval based on instance internal state 
 // (if it's running etc.)
 public void AdjustInterval() {
   if (IsRunning) // and may be other conditions
     EntityAnimation.interval = 10; //TODO: move magic number into constant 
   else 
     EntityAnimation.interval = 65; //TODO: move magic number into constant
 }