复杂的 If 条件。不好的做法?
Complex If conditions. Bad practice?
上下文: 我试图确保我的玩家只能在以下情况下冲刺:
- 他们正在前进,
- 按下"Sprint"键,
- 他们脚踏实地。
if ((Input.GetAxis("Vertical") == 1) && Input.GetButton("Sprint") && isGrounded)
{
isRunning = true;
relativeMovementSpeed = playerSprintSpeed * Time.deltaTime;
}
这是否被认为是不好的做法或可读性差?
如果是这样,哪种方法更好(标准化或更易于阅读)?
在一个 if
中评估多个事物并没有错。如果有的话,它比嵌套它们的替代方案更好。
但是,当此评估变得更大时,它可能变得不可读。您当前的示例(恕我直言)仍然可以,但是不同的人会在不同的地方画线。
当它变得太复杂而难以阅读时,您可以将评估抽象为小方法,例如:
private bool IsMovingForwards()
{
return Input.GetAxis("Vertical") == 1;
}
private bool IsSprintKeyPressed()
{
return Input.GetButton("Sprint");
}
这增强了 if
块的可读性:
if (IsMovingForwards() && IsSprintKeyPressed() && isGrounded)
{
// ...
}
这几乎完全重复了您对所需评估逻辑的描述。
编辑:只是要指出,您可以自由选择是使用局部变量、class 属性、帮助程序 class 还是抽象方法这些个人评价。我在这里使用了方法,但您可以根据您当前的上下文以多种方式进行处理。这里的主要目标是以易于阅读的方式标记逻辑。
我认为@Flater 方法很好。
我会稍微更改一下以使用属性:
private bool IsMovingForwards
{
get { return Input.GetAxis("Vertical") == 1; }
}
private bool IsSprintKeyPressed
{
get { return Input.GetButton("Sprint"); }
}
我会为 IsRunning 创建另一个:
private bool IsRunning
{
get { return IsMovingForwards && IsSprintKeyPressed && isGrounded; }
}
所以您的代码现在如下所示:
if (IsRunning)
relativeMovementSpeed = playerSprintSpeed * Time.deltaTime;
上下文: 我试图确保我的玩家只能在以下情况下冲刺:
- 他们正在前进,
- 按下"Sprint"键,
- 他们脚踏实地。
if ((Input.GetAxis("Vertical") == 1) && Input.GetButton("Sprint") && isGrounded)
{
isRunning = true;
relativeMovementSpeed = playerSprintSpeed * Time.deltaTime;
}
这是否被认为是不好的做法或可读性差?
如果是这样,哪种方法更好(标准化或更易于阅读)?
在一个 if
中评估多个事物并没有错。如果有的话,它比嵌套它们的替代方案更好。
但是,当此评估变得更大时,它可能变得不可读。您当前的示例(恕我直言)仍然可以,但是不同的人会在不同的地方画线。
当它变得太复杂而难以阅读时,您可以将评估抽象为小方法,例如:
private bool IsMovingForwards()
{
return Input.GetAxis("Vertical") == 1;
}
private bool IsSprintKeyPressed()
{
return Input.GetButton("Sprint");
}
这增强了 if
块的可读性:
if (IsMovingForwards() && IsSprintKeyPressed() && isGrounded)
{
// ...
}
这几乎完全重复了您对所需评估逻辑的描述。
编辑:只是要指出,您可以自由选择是使用局部变量、class 属性、帮助程序 class 还是抽象方法这些个人评价。我在这里使用了方法,但您可以根据您当前的上下文以多种方式进行处理。这里的主要目标是以易于阅读的方式标记逻辑。
我认为@Flater 方法很好。 我会稍微更改一下以使用属性:
private bool IsMovingForwards
{
get { return Input.GetAxis("Vertical") == 1; }
}
private bool IsSprintKeyPressed
{
get { return Input.GetButton("Sprint"); }
}
我会为 IsRunning 创建另一个:
private bool IsRunning
{
get { return IsMovingForwards && IsSprintKeyPressed && isGrounded; }
}
所以您的代码现在如下所示:
if (IsRunning)
relativeMovementSpeed = playerSprintSpeed * Time.deltaTime;