将条件链重写为单行序列

Posted

技术标签:

【中文标题】将条件链重写为单行序列【英文标题】:Rewriting a conditional chain as a sequence of one-liners 【发布时间】:2016-09-08 07:55:51 【问题描述】:

我有控制机器人主臂的 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);

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

【问题讨论】:

您在 IDE 中尝试过吗? 为了保存一个左大括号和右大括号?为什么不只做与第一个示例相同的操作,而是删除换行符? 您真的希望您的代码不可读且难以维护吗? mainArm.setPower(50) 可以在 if 之外。而且你不应该为了“更少的代码行”而牺牲可读性。 提示:与其担心如何降低代码的可读性,不如反其道而行之。从阅读 Robert Martin 的“干净代码”开始;只是为了了解您的想法会适得其反。 【参考方案1】:

此代码无法编译:

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

为了它:switch 语句仅比冗长的 if/else/if 级联“更好”。首先,它们看起来“更有条理”;但他们是错误的答案。 是的,switch 只是一种替代方案,但还有更多类似使用设计模式或根本不编写代码的方法 :)(使用第 3 方库)【参考方案3】:

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

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


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

【讨论】:

【参考方案4】:

您可以使用构建器设计模式。在 Java 实现中查看https://en.wikipedia.org/wiki/Builder_pattern

【讨论】:

【参考方案5】:

你可以使用三元运算符:

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

【讨论】:

以上是关于将条件链重写为单行序列的主要内容,如果未能解决你的问题,请参考以下文章

htaccess 条件重写规则与 mod_GeoIP

图片防盗链

Hibernate中用到联合主键的使用方法,为何要序列化,为何要重写hashcode 和 equals 方法

如何将“IF CONDITION”重写为 ON 3 分钟和 OFF 10 分钟直到 4 小时(240 分钟)

自定义 403 禁止使用重写条件

apache的rewrite重写日志切割防盗链