赞
踩
大家好,我是Lampard~~
欢迎来到Lua进阶系列的博客
前文再续,书接上一回。
今天讲解一下我在工作中遇到的代码优化问题。需求是这样的:我需要在项目的通用资源弹窗中加入一个新的资源道具,但是以前的通用弹窗道具可以换算成元宝,有自己的容量。但是新的道具是“英雄经验”是没有上述的属性的,所以有部分的逻辑是不适用于新增的道具,因此我一开始的处理方式是直接在各个判断的逻辑中加入if,else。只要展示的道具是英雄经验的话,则不执行那部分不适用的逻辑判断。写的代码又臭又长,但是没办法,只能硬着头皮递交上去。下面是我提交的部分代码:
反正就是见招拆招,用ifelse来跳过所有的不合适的逻辑判断,整个项目下来,功能没改多少,ifelse多了十几个,然后原本大佬前辈们写出的优雅简洁的代码就被我破坏了。果不其然上交之后,主管找我谈话了,他问我,如果后面再多加几个资源,你是不是一直在后面加ifelse?这样的代码可读性和修改起来是不是很麻烦?
道理我都懂,但是臣妾真的不会啊。主管仿佛也看穿了这一点,没有对我卖关子,直接就教给了我一种方式。如果对于一些通用的资源,适合所有逻辑的,则按照以前的程序走,对于新增不合适的,我们则执行简略的逻辑,跳过某些判断。
听到这里,难道是要对资源分成两类,然后进行两套的逻辑判断吗?我于是问主管是不是传参,区分两类的资源,然后执行不同的逻辑。主管高深莫测的说,非也,你还是太小看lua了。然后啪啦啪啦的写下了下面这段代码:
元表,居然是元表!!!主管把逻辑抽了出来,然后把抽出表中的__index字段定义成了通用的逻辑判断函数,然后特殊的就直接写进去,我们知道在lua的面向对象的流程执行的过程中,如果查找一个表的元素,找得到就返回该值,找不到则通过__index字段往他父类上找,以前我一直以为__index只能是一个表,结果原来是一个函数的话,程序会执行__index字段的函数,获取其返回值。所以说我们只需要把通用的逻辑执行函数写在__index字段中,而特殊的写出来,则巧妙的完成了需求,且可拓展性增强了许多。
说实话,这次的经历让我触动挺大的,从实习以来,自己就仿佛成为了一个ifelse,for循环的无脑机器。确实有很多优雅的写法需要我们去学习,不要无脑的为了完成需求而去完成需求。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。