将条件链重写为单行序列
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);
我在 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);