将条件链重写为单行序列

Rewriting a conditional chain as a sequence of one-liners

我在 Java 中有这个控制机器人主臂的代码:

if (gamepad1.left_stick_y > 50)
{
    mainArm.setDirection(DIRECTION_FORWARD);
    mainArm.setPower(50);
}
else if (gamepad1.left_stick_y < -50)
{
    mainArm.setDirection(DIRECTION_REVERSE);
    mainArm.setPower(50);
}

这只是一小部分,但还有大量的条件语句,如果条件为真,有些条件语句只有一个语句。是否可以简化为:[伪代码。不要从字面上理解它。我知道这行不通]

if (gamepad1.left_stick_y > 50) mainArm.setDirection(DIRECTION_FORWARD), mainArm.setPower(50);
else if (gamepad1.left_stick_y < -50) mainArm.setDirection(DIRECTION_REVERSE), mainArm.setPower(50);

不幸的是,用于直接与硬件接口以设置电源等的库是封闭源代码,因此无法修改它们。

如果您更改 setter 使其返回 this 那么您可以链接方法调用:

public MainArm setDirection(int dir) {
    this.direction = dir;
    return this;
}

if (gamepad1.left_stick_y > 50) mainArm.setDirection(DIRECTION_FORWARD).setPower(50);

您可以使用构建器设计模式。在 Java 实现

中查看 https://en.wikipedia.org/wiki/Builder_pattern

您提出的优化方案很糟糕。它比原来的更糟糕。代码变得不那么可读并且更容易出错。如果有多个这样的条件,可以考虑通过以更面向对象的方式重新设计逻辑或通过定义将从 switch 语句调用的方法来进行重构...

此代码无法编译:

if (gamepad1.left_stick_y>50) mainArm.setDirection(DIRECTION_FORWARD), mainArm.setPower(50);
//                                                                   ^

您尝试通过放置逗号将多个操作转换为一个操作是行不通的:

JLS 15.27: Unlike C and C++, the Java programming language has no comma operator.

一种方法是允许在一次调用中改变功率和方向:

if (gamepad1.left_stick_y > 50) mainArm.setDirectionAndPower(DIRECTION_FORWARD, 50);

the libraries for setting power and such are closed source

如果你不能修改库,你可以制作自己的辅助方法来弥补这个缺点:

private static void setDirectionAndPower(Arm arm, Direction dir, int pow) {
    arm.setDirection(dir);
    arm.setPower(pow);
}

您可以使用三元运算符:

mainArm.setDirection((gamepad1.left_stick_y > 50)?DIRECTION_FORWARD:DIRECTION_REVERSE);
mainArm.setPower(50);