前几天看到了猫大师准备用工厂模式来代替多if判断,然后试一下如何在vfp里使用工厂模式来处理多if的判断,
在只有一个判断参数的情况下,已导出excel为例子,写多判断的时候可能都是这么写
export_type = "zw"
DO CASE
case export_type="zw"
MESSAGEBOX("导出zw.excel")
case export_type="ls"
MESSAGEBOX("导出ls.excel")
case export_type="ww"
MESSAGEBOX("导出ww.excel")
OTHERWISE
MESSAGEBOX("无此格式")
ENDCASE
缺点猫大师也说过了,逻辑复杂,维护性差。
想解决多判断,前提就是从自己手写判断,到利用代码机制或者对象方法或者某种API来帮我们判断,还是以导出excel为例子
工厂模式,就是你的类库像工厂一样,你要什么产品,传入一个参数,他就给你一个对应的对象,对像就可以完成很多工作。
1. 首先先定义一个工厂类
2. 把上面判断中的过程代码封装成一个个策略方法
3. 设置一个获取策略的方法,利用&执行宏替换,指定工厂类的策略
Define Class ExportExcelFactory as Collection
**zw策略
Procedure export_zw
MESSAGEBOX("导出zw.excel")
ENDPROC
**ls策略
Procedure export_ls
MESSAGEBOX("导出ls.excel")
ENDPROC
**ww策略
Procedure export_ww
MESSAGEBOX("导出ww.excel")
ENDPROC
**获取策略
Procedure getStrategy(strategy)
TRY
func_name="export_"+strategy
this.&func_name()
CATCH
**兜底
MESSAGEBOX("无此格式")
ENDTRY
ENDPROC
ENDDEFINE
重构后的业务代码就变成了
export_type = thisform.combo1.Value
excel_factory = CREATEOBJECT("ExportExcelFactory")
excel_factory.getStrategy(export_type)
这里我是利用vfp的&宏替换来帮我进行参数的判断,虽然代码比之前的do case多,但是以后要增加判断的时候,我们可以不用更改业务代码,只需要在工厂类里增加对应的策略就可以了
在js里,也可以用到类似的方法来解决多if的判断
let ErrorFactory = new Map();
let notLogin = {msg : "未登录", icon : "xxxxx"}
let notAuth = {msg : "无此权限", icon : "yyyyy"}
let notFound = {msg : "未找到此资源", icon : "zzzz"}
ErrorFactory.set(10001,notLogin)
ErrorFactory.set(10002,notAuth)
ErrorFactory.set(10003,notFound)
export default ErrorFactory
import ErrorFactory from "./test";
let code = 10001
let {msg,icon} = ErrorFactory.get(code);
uni.showToast({
title : msg,
image : icon
})
这里我是利用了map键值对的简直来帮我进行参数的判断并实现不同状态下所执行的业务代码
最后,解决多层判断的本质,就是利用代码机制或者对象方法或者某种API来帮我们判断.
当然有老狐就会批判这种做法,说我们原来的模式多简单,一条代码写到底。
每种设计模式都是有应用场景的,了解了这些模式之后,要思考什么场景更适何,像猫框BS的入口,就是动态的,根据传入的文件名,对了一个对应的对象,就可以做非常的多的工作了。