这个有 4 个分支的 if 语句,能如何化简逻辑,变成仅一个条件的 三目运算(条件 ? 为真时执行 : 为假时执行)呢?

@Ta 2023-01-13发布,2023-01-13修改 12213点击

原问题是一个关于 SQLite 触发器的问题。用 C 系语言描述逻辑如下:

// 只更新了行政区划代码,则按这个代码进行后续逻辑
if (new_addr == old_addr && new_code != old_code)
    return new_code;

// 只更新了地址,则解析出地址对应的行政区划代码,再后续逻辑
else if (new_addr != old_addr && new_code == old_code)
    return parse(new_addr);

// 两者都没更新,则是来自 INSERT 触发器的(SQLite 不支持合并 INSERT UPDATE 触发器)
// 提供了行政区划代码,则优先使用,否则解析提供的地址
else if (new_code == NULL)
    return parse(new_addr);
else
    return new_code;

其中,parse(new_addr) 实际是 40 行左右的 SQL 代码。重复写两次太冗余了,需要化简成一个。

我目前看不出啥共性,只能老老实实列出所有情况后,改写成一个位运算:

return (1 << (((new_addr == old_addr) << 2) | ((new_code == old_code) << 1) | (new_code == NULL))) & 0x71 ? new_code : parse(new_addr);

但看起来,可读性太差,维护起来麻烦。

还能化简成啥更直观、易维护的逻辑呢?

回复列表(8|隐藏机器人聊天)
  • @Ta / 2023-01-13 / /
    image.png(14.39 KB)image.png(28.81 KB)
  • @Ta / 2023-01-13 / /
    没毛病 加油加油加油
  • @Ta / 2023-01-13 / /

    @无名啊,因为每行代码都return,所以可以安全的删除所有else。

    // 只更新了行政区划代码,则按这个代码进行后续逻辑
    if (new_addr == old_addr && new_code != old_code) {
        return new_code;
    }
    // 只更新了地址,则解析出地址对应的行政区划代码,再后续逻辑
    if (new_addr != old_addr && new_code == old_code) {
        return parse(new_addr);
    }
    // 两者都没更新,则是来自 INSERT 触发器的(SQLite 不支持合并 INSERT UPDATE 触发器)
    // 提供了行政区划代码,则优先使用,否则解析提供的地址
    if (new_code == NULL) {
        return parse(new_addr);
    }
    return new_code;
    
  • @Ta / 2023-01-13 / /

    @旧人@寻梦xunm,挺不错的。8 种情况里,有 7 种都对了。

    只有 new_addr != old_addr && new_code != old_code && new_code != NULL 时答案不对。

    原逻辑结果应为 new_codeChatGPT 结果为 parse(new_addr)

  • @Ta / 2023-01-13 / /

    @老虎会游泳,对的,可以这样。

    可能我觉得,一条 if 语句,可能会比,四条 if 语句,参与讨论的人多。。

  • hik
    @Ta / 2023-01-14 / /
    别问,问就问chatgpt
  • @Ta / 2023-01-14 / /

    @hik,现在还有啥不用注册就能使用的渠道嘛

  • hik
    @Ta / 2023-01-16 / /
    @无名啊,chatgpt.sbaliyun.com。但最好还是官网,官网可以记忆上下文。
添加新回复
回复需要登录