C# 这是一种糟糕的做法吗?
有时,我发现自己编写了一个bool方法,如下所示: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;
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
}