C# 复杂的If条件。坏习惯?

C# 复杂的If条件。坏习惯?,c#,unity3d,readability,code-readability,C#,Unity3d,Readability,Code Readability,背景:我试图确保我的玩家只有在以下情况下才能冲刺: 他们正在前进, 按下冲刺键, 他们被停飞了。 这被认为是错误的做法还是可读性差 如果是这样的话,用一种标准化的或更容易阅读的方法来做这件事会更好吗?在一个If中评估多个事物没有错。如果说有什么区别的话,那就是它比另一种选择要好,那就是将它们筑巢 但是,当此评估扩展到更大的规模时,它可能会变得不可读。你现在的例子是IMHO仍然可以,但是不同的人会在不同的地方划定界限 当它变得过于复杂而难以阅读时,您可以将评估抽象为小方法,例如: private

背景:我试图确保我的玩家只有在以下情况下才能冲刺:

他们正在前进, 按下冲刺键, 他们被停飞了。 这被认为是错误的做法还是可读性差


如果是这样的话,用一种标准化的或更容易阅读的方法来做这件事会更好吗?

在一个If中评估多个事物没有错。如果说有什么区别的话,那就是它比另一种选择要好,那就是将它们筑巢

但是,当此评估扩展到更大的规模时,它可能会变得不可读。你现在的例子是IMHO仍然可以,但是不同的人会在不同的地方划定界限

当它变得过于复杂而难以阅读时,您可以将评估抽象为小方法,例如:

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

private bool IsSprintKeyPressed()
{
    return Input.GetButton("Sprint");
}
它增强了if块的可读性:

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


编辑:只是要指出,您可以自由选择是使用局部变量、类属性、助手类还是方法来抽象这些单独的计算。我在这里使用了一些方法,但根据您当前的上下文,您可以通过多种方式来实现这一点。这里的主要目标是以一种易于阅读的方式标记逻辑。

在一个if中评估多个事物没有什么错。如果说有什么区别的话,那就是它比另一种选择要好,那就是将它们筑巢

但是,当此评估扩展到更大的规模时,它可能会变得不可读。你现在的例子是IMHO仍然可以,但是不同的人会在不同的地方划定界限

当它变得过于复杂而难以阅读时,您可以将评估抽象为小方法,例如:

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

private bool IsSprintKeyPressed()
{
    return Input.GetButton("Sprint");
}
它增强了if块的可读性:

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


编辑:只是要指出,您可以自由选择是使用局部变量、类属性、助手类还是方法来抽象这些单独的计算。我在这里使用了一些方法,但根据您当前的上下文,您可以通过多种方式来实现这一点。这里的主要目标是以一种易于阅读的方式标记逻辑。

我认为@Flater方法很好。 我将对其进行一些更改,以使用属性:

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

private bool IsSprintKeyPressed
{
    get { return Input.GetButton("Sprint"); }
}
我将为iRunning创建另一个:

private bool IsRunning
{
    get { return IsMovingForwards && IsSprintKeyPressed && isGrounded; }
}
因此,您的代码如下所示:

if (IsRunning)
    relativeMovementSpeed = playerSprintSpeed * Time.deltaTime;

我认为@Flater方法很好。 我将对其进行一些更改,以使用属性:

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

private bool IsSprintKeyPressed
{
    get { return Input.GetButton("Sprint"); }
}
我将为iRunning创建另一个:

private bool IsRunning
{
    get { return IsMovingForwards && IsSprintKeyPressed && isGrounded; }
}
因此,您的代码如下所示:

if (IsRunning)
    relativeMovementSpeed = playerSprintSpeed * Time.deltaTime;

我不认为这很糟糕,但如果有什么不同的话,我认为Input.GetAxisVertical==1对可读性的影响最大。您可以将它们拉入一个单独的变量,如boolmovingforward=Input.GetAxisVertical==1;或者别的什么。我也看到了在这种情况下使用的条件之间的中断;AI和机器学习的整个领域毕竟只是一堆嵌套的ifs:-我不认为这很糟糕,但如果有什么不同的话,我认为Input.GetAxisVertical==1对可读性的影响最大。您可以将它们拉入一个单独的变量,如boolmovingforward=Input.GetAxisVertical==1;或者别的什么。我也看到了在这种情况下使用的条件之间的中断;人工智能和机器学习的整个领域毕竟只是一堆嵌套的ifs:-