一说到判断,大家一定会想if-else呗,这个有啥的。可就是我们经常用的if-else给我们的程序带来了,繁琐的结构,晦涩的代码,凌乱的组织。我经常看到,完全看不懂的判断,在哪里疯狂猜测,这个是要干什么,有的时候甚至我要找到我需要调试的的一个分支,需要用去好长时间。到底判断语句怎么了,我想通过一个例子讨论一下判断怎么写才好:
判断应该是在程序中经常使用的,分支交交叉叉,当条件复杂,情况凌乱的时候,我们的判断也呈现了,恐怖的繁琐,应该怎么做,其实我也做了一些思考,下面就用一个例子,一步步探讨一下应该怎么写判断语句。
if pmd.text_field(:name,"msgHolder").exist? msg=pmd.text_field(:name,"msgHolder").text @log.info("弹出modal_dialg窗口信息如下:[#{msg}],标题:[#{p_title}]") if msg.index("是否缴费") pmd.button(:id,"btnYes").click elsif msg.index("检查通过,是否继续") pmd.button(:id,"btnYes").click elsif msg.index("用户目前积分") pmd.button(:id,"btnYes").click elsif msg.index("打印") pmd.button(:id,"btnNo").click elsif msg.index("对不起") @log.warn("弹出异常窗口窗口[#{msg}],标题:[#{p_title}]") #pmd.button(:id,"btnOK").click raise "出现异常窗口,提示信息如下:#{msg}" elsif msg.index("错误信息") @log.warn("弹出异常窗口窗口[#{msg}],标题:[#{p_title}]") #pmd.button(:id,"btnOK").click raise "出现异常窗口,提示信息如下:#{msg}" elsif msg.index("检查不通过:当前用户不是正常在网用户err!!!") @log.warn("弹出异常窗口窗口[#{msg}],标题:[#{p_title}]") #pmd.button(:id,"btnOK").click raise "出现异常窗口,提示信息如下:#{msg}" elsif msg.index("确定要提交") pmd.button(:id,"btnYes").click elsif msg.index("业务受理完成") pmd.button(:id,"btnOK").click elsif msg.index("操作成功") pmd.button(:id,"btnOK").click else @log.warn("不存在弹出modal_dialg窗口的默认处理方式:[#{msg}],标题:[#{p_title}]") if pmd.button(:id,"bunOK").exists? pmd.button(:id,"bunOK").click elsif pmd.button(:id,"btnYes").exists? pmd.button(:id,"btnYes").click elsif pmd.button(:id,"btnNo").exists? pmd.button(:id,"btnNo").click end end end
这是一段自动化测试执行的时候,判断弹出窗口,之后进行相应处理的代码,我想在遇到这样的情况,很多人都会选用跟我一样的方式进行处理。这样一个代码不知道真是让人不知道从何看起,就好像一团乱麻。有的人,会第一个提出来,说,嗯用switch的语句,比if-else好看,你这样应该用switch;稍等,这这里面判断用的是index()判断字符串是否包含一个字符串,switch是判断相等,这样做不行,也许可以合并if条件。那代码就化简成这个样子了:
if pmd.text_field(:name,"msgHolder").exist? msg=pmd.text_field(:name,"msgHolder").text @log.info("弹出modal_dialg窗口信息如下:[#{msg}],标题:[#{p_title}]") if msg.index("是否缴费") || msg.index("检查通过,是否继续") || msg.index("用户目前积分") || msg.index("确定要提交") pmd.button(:id,"btnYes").click elsif msg.index("打印") || msg.index("对不起") || msg.index("错误信息") || msg.index("错误信息") pmd.button(:id,"btnNo").click elsif msg.index("业务受理完成") || msg.index("操作成功") pmd.button(:id,"btnOK").click else @log.warn("不存在弹出modal_dialg窗口的默认处理方式:[#{msg}],标题:[#{p_title}]") if pmd.button(:id,"bunOK").exists? pmd.button(:id,"bunOK").click elsif pmd.button(:id,"btnYes").exists? pmd.button(:id,"btnYes").click elsif pmd.button(:id,"btnNo").exists? pmd.button(:id,"btnNo").click end end end
恩,这样似乎简单了许多,就这样就大功告成了吗?请注意:这里的判断条件之长啊,看起来很不和谐,查询起来也有问题,怎么办啊?有的时候根本看不懂判断条件都判断了什么。关于各种判断条件过长的问题,也许可以定义一个函数去做处理,那就这样写
def ifbtnyes(msg) msg.index("是否缴费") || msg.index("检查通过,是否继续") || msg.index("用户目前积分") || msg.index("确定要提交") end def ifbtnno(msg) msg.index("打印") || msg.index("对不起") || msg.index("错误信息") || msg.index("错误信息") end def ifbtnok(msg) msg.index("业务受理完成") || msg.index("操作成功") end if pmd.text_field(:name,"msgHolder").exist? msg=pmd.text_field(:name,"msgHolder").text @log.info("弹出modal_dialg窗口信息如下:[#{msg}],标题:[#{p_title}]") if ifbtnyes(msg) pmd.button(:id,"btnYes").click elsif ifbtnno(msg) pmd.button(:id,"btnNo").click elsif ifbtnok(msg) pmd.button(:id,"btnOK").click else @log.warn("不存在弹出modal_dialg窗口的默认处理方式:[#{msg}],标题:[#{p_title}]") if pmd.button(:id,"bunOK").exists? pmd.button(:id,"bunOK").click elsif pmd.button(:id,"btnYes").exists? pmd.button(:id,"btnYes").click elsif pmd.button(:id,"btnNo").exists? pmd.button(:id,"btnNo").click end end end
这样吧判断移出来,看着好多了,但是我们还是发现,类似这样的判断 “msg.index("打印") || msg.index("对不起") || msg.index("错误信息") || msg.index("错误信息")”看起来还是很讨厌,而且我居然多出了三个函数(前往别说把三个函数判断简单合并起来形成一个函数,那样不是退回去了吗?)。我们还可以化简,其实我们发现函数一直都是在判断是否含有相应的操作,只是判断的内容不同,那也许可以进行这样的合并:
def getbtntype(msg) btnyes=["是否缴费","检查通过,是否继续","用户目前积分","确定要提交"] btnno=["打印","对不起","错误信息","错误信息"] btnok=["业务受理完成","操作成功"] btnyes.each do |b| if b.index(msg) return 1 end end btnno.each do |b| if b.index(msg) return 2 end end btnok.each do |b| if b.index(msg) return 3 end end end if pmd.text_field(:name,"msgHolder").exist? msg=pmd.text_field(:name,"msgHolder").text @log.info("弹出modal_dialg窗口信息如下:[#{msg}],标题:[#{p_title}]") case(getbtntype(msg)) when 1 pmd.button(:id,"btnYes").click when 2 pmd.button(:id,"btnNo").click when 3 pmd.button(:id,"btnOK").click default @log.warn("不存在弹出modal_dialg窗口的默认处理方式:[#{msg}],标题:[#{p_title}]") if pmd.button(:id,"bunOK").exists? pmd.button(:id,"bunOK").click elsif pmd.button(:id,"btnYes").exists? pmd.button(:id,"btnYes").click elsif pmd.button(:id,"btnNo").exists? pmd.button(:id,"btnNo").click end end end
这样化简了好多,也看到这里也是用了swtich,我们可以清晰地看到哪些字段,是应该做哪种操作的。从头到尾,是把弹出窗口分类出三类,但是,是否有会有特殊情况,是否有特殊情况,就要加一类啊?似乎维护性还不是很好,还可以继续优化,那么继续:
def getbtntype(msg) btns={["是否缴费","检查通过,是否继续","用户目前积分","确定要提交"]=>"pmd.button(:id,\"bunYes\").click", ["打印","对不起","错误信息","错误信息"]=>"pmd.button(:id,\"bunNO\").click", ["业务受理完成","操作成功"]=>"pmd.button(:id,\"bunOK\").click" } btns.each do |k,v| if(k.is_a?(Array)) k.each do |item| if(msg.index(item)) return v end end else if msg.index(k) return v end end end return " if pmd.button(:id,\"bunOK\").exists? pmd.button(:id,\"bunOK\").click elsif pmd.button(:id,\"btnYes\").exists? pmd.button(:id,\"btnYes\").click elsif pmd.button(:id,\"btnNo\").exists? pmd.button(:id,\"btnNo\").click " end eval getbtntype(msg)经过一番,优化,现在已经把刚才复杂的函数化简成了,这个样子,从函数上看,非常清晰,如果再要增加相应的弹出窗口判断,也只要改那个hash对象就可以了。