CutIf消除if_else

CutIf消除if_else

避免过度封装,合适就好。但是对于大量的业务代码,还是业务出去比较好,主线逻辑保证清晰

消除连续范围的if

1 < x <= 22, 22 < x < 66 ....

实现思路

  1. 运用look_up

  2. 按照从小到的的顺序存进切片

  3. 多少个间隔,放多少个算法,也就是业务策略

  4. 放进map,返回主体函数,直接get出来

  5. 对于小于等于的边界处理:

    定义超乎想象的数字,根据这个数字作为取等的标准

实现代码

核心包代码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

责任链

不太推荐

posted @ 2020-12-13 17:50  maob  阅读(121)  评论(0编辑  收藏  举报