go - 在 Go 中编写多个带有数字范围的嵌套 if-else 的简洁方法
问题描述
这段代码是有效的,但是我看的时候感觉不太好。我在重构为更清晰或更短的东西时遇到了麻烦。将代码分成几个 if-return 在这里似乎没有太大帮助。提示?谢谢!
if t < 0 {
r = 0
} else if t >= 0 && t < 7.5 {
if m >= 0 && m < 0.125 {
r = 1
} else {
r = 2
}
} else if t >= 7.5 && t < 10 {
if m >= 0 && m < 0.125 {
r = 1
} else {
r = 4
}
} else if t >= 10 && t < 20 {
if m >= 0 && m < 0.125 {
r = 1
} else if m >= 0.125 && m < 0.25 {
r = 3
} else {
r = 4
}
} else if t >= 20 && t < 22.5 {
if m >= 0 && m < 0.125 {
r = 7
} else if m >= 0.125 && m < 0.375 {
r = 3
} else {
r = 4
}
} else if t >= 22.5 && t < 27.5 {
if m >= 0 && m < 0.125 {
r = 7
} else if m >= 0.125 && m < 0.625 {
r = 5
} else {
r = 6
}
} else if t >= 27.5 {
if m >= 0 && m < 0.25 {
r = 7
} else if m >= 0.25 && m < 0.625 {
r = 5
} else {
r = 6
}
}
解决方案
简化外部 if / else if / else 去除冗余比较并转换为 switch:
switch {
case t < 0:
r = 0
case t < 7.5:
if m >= 0 && m < 0.125 {
r = 1
} else {
r = 2
}
case t < 10:
if m >= 0 && m < 0.125 {
r = 1
} else {
r = 4
}
case t < 20:
if m >= 0 && m < 0.125 {
r = 1
} else if m >= 0.125 && m < 0.25 {
r = 3
} else {
r = 4
}
case t < 22.5:
if m >= 0 && m < 0.125 {
r = 7
} else if m >= 0.125 && m < 0.375 {
r = 3
} else {
r = 4
}
case t < 27.5:
if m >= 0 && m < 0.125 {
r = 7
} else if m >= 0.125 && m < 0.625 {
r = 5
} else {
r = 6
}
default:
if m >= 0 && m < 0.25 {
r = 7
} else if m >= 0.25 && m < 0.625 {
r = 5
} else {
r = 6
}
}
可以对内部语句进行类似的修改。编码:
if m >= 0 && m < 0.125 {
r = 1
} else {
r = 2
}
变成:
switch {
case m < 0:
// r not changed
case m < 0.125:
r = 1
default:
r = 2
}
推荐阅读
- java - 将字符串 6 转换为 mm/dd/yyyy h:m 有条件
- angular - Angular ContentChildren 跨模块获取指令 Inputs 和 TemplateRef
- haskell - Haskell中关联类型的约束
- spring-boot - Springboot 招摇与 JsonView
- jquery - 如何将外部 jquery 库导入 webpack?
- google-chrome - Chrome 浏览器 - 启用集成 Windows 身份验证 - 自动登录
- python - 使用 Python 输出多个随机密码
- react-native - 仅反应原生构建(android)
- javascript - 如何使用 ajax 通信 python-mysql 和 js?
- c# - 在 .Net Dynamics CRM 应用程序中保存要联系的父帐户