标题: 这个有 4 个分支的 if 语句,能如何化简逻辑,变成仅一个条件的 三目运算(条件 ? 为真时执行 : 为假时执行)呢?
时间: 2023-01-13发布,2023-01-13修改
原问题是一个关于 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|显示机器人聊天)』
@无名啊,因为每行代码都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;