[英]Is this kind of a bool method a bad practice?
有时我发现自己写的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)然后我只是检查Space是否被按下,如果是,则我的动画更快(间隔越小,spritesheet更改越快),然后它发送true值,这意味着Player正在运行,否则我不是原因没有按空格。
然后我必须在第一个if语句之外重复这个'else'代码,这样如果Player没有移动或者他的耐力Regan是假的,它会发送Player没有运行;
所以我只是想知道这种bool方法被认为是一种不好的做法(你在嵌套if中重新获得true和false值,然后在嵌套if之后返回false并重复相同的代码)?
该方法有副作用 ,这就是为什么这是一个不好的做法 :
public bool isRunning()
在查看方法的签名时,我们期待只有true
/ false
答案,仅此而已。 但是,该方法更改实例的状态 :
...
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
}
在方法中包含一个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;
}
我会考虑在某种程度上引入一个名为boolean的自我文档,并且我将staminaRegan
重命名为staminaIsRegenerating
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()
我认为我们为人(其他开发人员)编写代码,当然机器执行代码,但80%的开发人员的工作是阅读代码。
基于此,我认为读取流程必须与执行代码流程完全相同 - 这就是为什么我认为乘法return
语句不是坏事,甚至比方法底部只有一个return语句更好。
我喜欢这种风格,我也喜欢它。 首先,您可以更轻松地阅读代码,其次它具有调试优势,因为您可以为其他个案设置断点。 否则,您将需要使用断点条件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.