Java 将条件链重写为一行程序序列

Java 将条件链重写为一行程序序列,java,conditional,Java,Conditional,我用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);

我用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)
{
主臂设置方向(向前方向);
主臂设置功率(50);
}
否则如果(gamepad1.left_stick_y<-50)
{
主臂设置方向(方向\反向);
主臂设置功率(50);
}
这只是很小的一部分,但是有很多这样的条件句,如果条件为真,有些条件句只有一条语句。它可以简化为:[伪代码。不要照字面理解。我知道它不会工作]

if(gamepad1.left_stick_y>50)主臂设置方向(DIRECTION_FORWARD),主臂设置功率(50);
否则,如果(gamepad1.left_stick_y<-50)主臂设置方向(DIRECTION_REVERSE),主臂设置功率(50);

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

如果更改setter使其返回此
,则可以链接方法调用:

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

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

您可以使用生成器设计模式。看看Java实现

您提出的优化是一个糟糕的优化。它比原来的更糟。代码的可读性变差,更容易出错。如果有多个这样的条件,人们可以考虑重构,或者通过以更为OOP的方式重新设计逻辑,或者通过定义一个从交换语句调用的方法……/P> < P>这个代码不会编译:

if (gamepad1.left_stick_y>50) mainArm.setDirection(DIRECTION_FORWARD), mainArm.setPower(50);
//                                                                   ^
通过放置逗号将多个操作转换为一个操作的尝试无效:

15.27:与C和C++不同,java编程语言没有逗号运算符。 一种方法是允许在一次呼叫中更改电源和方向:

if (gamepad1.left_stick_y > 50) mainArm.setDirectionAndPower(DIRECTION_FORWARD, 50);
用于设置电源等的库是封闭源代码

如果无法修改库,则可以创建自己的帮助器方法来解决此缺点:

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);

您是否已经在IDE中进行了尝试?为了保存打开和关闭大括号?为什么不执行与第一个示例中相同的操作,但删除换行符?您真的希望代码不可读且难以维护吗?mainArm.setPower(50)可以在if之外。而且你不应该为了“更少的代码行”而牺牲可读性。提示:你应该做相反的事情,而不是担心如何降低代码的可读性。从阅读罗伯特·马丁的《干净的代码》开始;只是为了了解你的想法是多么的适得其反。并且为了这个目的:switch语句只比冗长的if/else/if级联稍微“好”。首先,他们看起来“组织得更好”;但答案是错误的。是的,switch只是一种替代方案,但还有更多类似于采用设计模式或根本不编写代码的情况:)(使用第三方数据库)
mainArm.setDirection((gamepad1.left_stick_y > 50)?DIRECTION_FORWARD:DIRECTION_REVERSE);
mainArm.setPower(50);