CutIf消除if_else
CutIf消除if_else
避免过度封装,合适就好。但是对于大量的业务代码,还是业务出去比较好,主线逻辑保证清晰
消除连续范围的if
1 < x <= 22
,22 < x < 66
....
实现思路
-
运用look_up
-
按照从小到的的顺序存进切片
-
多少个间隔,放多少个算法,也就是业务策略
-
放进map,返回主体函数,直接get出来
-
对于小于等于的边界处理:
定义超乎想象的数字,根据这个数字作为取等的标准
实现代码
核心包代码cutif.go
// 返回策略类型
package cutif
func CutRangePack(s []int, index []int, stand int) []int {
for _, v := range index {
s[v] += stand
}
return s
}
// 假设 0 , 100, 200
// param: 作为 0 < x < 1000 的 x
// sliceData: 作为 0 < x < 1000 的 0和100的节点切片
// stragy: 策略,取出去的时候自己断言
// stand: 作为判断是够取等的数字,不能写死,设置自己业务合适的数字
// isLeft: true -> x < 0 就开始了映射; fasle: 0 < x 才开始映射
func CutRange(param int, sliceData []int, stragy []interface{}, stand int, isLeft bool) (interface{}, error) {
var (
level int
m map[int]interface{}
)
level = 0
m = make(map[int]interface{})
// 更改下面的i 或者 i + 1可以改变映射结构偏移
// 有的人想直接用 x < 1: m[i]
// 有的人想用 1 < x < 66 : m[i + 1]
if isLeft {
for i := 0; i < len(stragy); i++ {
m[i] = stragy[i]
}
} else {
for i := 0; i < len(stragy); i++ {
m[i+1] = stragy[i]
}
}
for i := 0; i < len(sliceData); i++ {
if sliceData[i] > stand {
if param <= sliceData[i]-stand {
return m[level], nil
}
} else {
if param < sliceData[i] {
return m[level], nil
}
}
level++
}
return -1, nil
}
业务策略 + main.go
package main
import (
"fmt"
"go-newbase/cutif"
)
type Strategy interface {
Algo()
}
type One struct{}
func newOne() Strategy {
return &One{}
}
func (One) Algo() {
fmt.Println("算法A")
}
type Two struct{}
func newTwo() Strategy {
return &Two{}
}
func (Two) Algo() {
fmt.Println("算法B")
}
type Three struct{}
func newThree() Strategy {
return &Three{}
}
func (Three) Algo() {
fmt.Println("算法C")
}
type Four struct{}
func newFo() Strategy {
return &Four{}
}
func (Four) Algo() {
fmt.Println("算法D")
}
func newAllStr() []interface{} {
var (
res []interface{}
)
res = make([]interface{}, 0)
res = append(res, newOne(), newTwo(), newThree(), Four{})
return res
}
func main() {
s := []int{1, 3, 5, 7, 9}
index := []int{1}
stand := 999
pack := cutif.CutRangePack(s, index, stand)
// 下面的param是上面传过来的形参
ty, _ := cutif.CutRange(2, pack, newAllStr(), stand, true)
strategy := ty.(Strategy)
strategy.Algo()
}
消除特定的if
type == 1, type == 2
直接放进map里面就ok
责任链
不太推荐