小需求从ifelse屎山堆积到优雅的代码
今天我接到了一个业务需求,要求扩展现有功能完成某个字段下发。(随手记一下吧)
情况大概是这样的:
- 有某个商品类目新增俩个字段,分别是尺码和长度。
- 下发这字段会分几种场景
- 尺码和长度可能为空
- 尺码和长度为空的情况下下发的字符串内容不同
这算是一个比较简单的需求吧。
可以通过
if scene == 1{
if size "" && length ""{
}else if .....
}else if scene == 2{
}
可以明显感受到这种堆砌ifelse的代码非常恶心。
来看看怎么优化它?
- 考虑到这是某一个商品类目的需求,后续可能其他类目也可能会迭代类似的需求那就可以考虑用工厂方法模式
首先定义一个interface
// 工厂接口 type PopSizeInfoBuilder interface { Build() (content string) // content为下发的字符串内容 } // 定义一个具体的struct type xxxFactory struct{} // 具体工厂 func Newxxx(ctx *context.context) *xxxFactory { return &ShoesPopSizeInfo{scene: ctx.ModuleFnsData.SizeDeviationScene} } // 创建对象 func (xx *xxFactory) CreateBuilder(ctx *context.context) { return Newxxx(ctx) } //最后实现工厂接口 func (xx *xxFactory) Build() (content string){ switch: case: // 具体逻辑 } //最后在业务层函数调用 func xxxbiz(){ // ....前面的逻辑 if rid == xxxrid{ x := CreateBuilder content := x.Build } //通过判断rid来下发content为后续业务实现扩展,而不必一直堆砌屎山 // ...后面的逻辑 }#牛客创作赏金赛#