复杂的如果条件。做法不好?[不公开]

问题描述 投票:1回答:1

上下文。 我想确保我的球员只能在以下情况下冲刺:

  1. 他们是... 前进,
  2. "冲刺 "键被按下,
  3. 它们是 接地。
if ((Input.GetAxis("Vertical") == 1) && Input.GetButton("Sprint") && isGrounded)
        {
            isRunning = true;
            relativeMovementSpeed = playerSprintSpeed * Time.deltaTime;
        } 

这算不算是 陋习或可读性差?

如果有,有什么更好的(要么是标准化的,要么是更容易阅读的)方法?

c# unity3d readability code-readability
1个回答
4
投票

在一个函数中评估多个事物并没有什么不妥。if. 如果有的话,这比将它们嵌套在一起的替代方案要好。

然而,当这个评估增长到更大的规模时,它可能变得不可读。你现在的例子(IMHO)还是不错的,但不同的人会在不同的地方划定界限。

当它变得太复杂而不容易阅读时,你可以将评价抽象成小方法,例如。

private bool IsMovingForwards()
{
    return Input.GetAxis("Vertical") == 1;
}

private bool IsSprintKeyPressed()
{
    return Input.GetButton("Sprint");
}

这样可以提高你的可读性 if 块。

if (IsMovingForwards() && IsSprintKeyPressed() && isGrounded)
{
    // ...
} 

这几乎完全重复了你对所需评估逻辑的描述。

编辑:只是想指出,你可以自由选择是使用局部变量、类属性、帮助类还是方法来抽象这些单独的评估。我在这里使用了方法,但你可以根据你当前的上下文以多种方式来处理这个问题。这里的主要目标是以一种易于阅读的方式标记逻辑。


1
投票

我认为@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;
© www.soinside.com 2019 - 2024. All rights reserved.