zoukankan      html  css  js  c++  java
  • 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

    责任链

    不太推荐

  • 相关阅读:
    Navicat连接mysql提示1251解决方案
    js获取select下拉框选中的值
    Windows下安装Mysql数据库
    ASP.NET MVC API以及.Core API进行安全拦截和API请求频率控制
    myeclipse 10.7中文破解版 下载安装看着一篇就够了
    Runtime exception at 0x004000bc: invalid integer input (syscall 5)
    MARS(MIPS汇编程序和运行时模拟器)
    如何将本地的代码上传到github
    JavaWeb基础
    大学什么时候开学?这款小程序告诉你!
  • 原文地址:https://www.cnblogs.com/maomaomaoge/p/14129361.html
Copyright © 2011-2022 走看看