对开发人员而言,代码复用是一种非常常规的动作。通常我们可以封装一些代码作为一个函数,然后通过参数反复调用以减少重复代码。而Excel使用者们也会编写一种叫做宏的东西来达到类似效果(实际上宏就是保存好的VBA函数)。
开始编写Canvas app表达式之后,大家会发现,这东西不能自定义函数啊!
这个坑不大不小,刚好把大家的热情之火浇灭。毕竟在控件之间复制粘贴是小事,挺容易的,但是回头来修改的时候,不知道自己(或者别人)复制过多少处就是个非常麻烦的大事了。一旦漏掉了一两处,恐怕功能上是要出大问题的。
那么微软有没有提供解决方案呢?
答案是:真没有!
不过我们还是可以通过原有功能进行变通处理,虽然不够完美,但是聊胜于无了。做法就在Select函数上。
Select function - Power Appsdocs.microsoft.com这个函数的作用是选中控件,可以被用于触发按钮。
既然有这个,解决问题的方法,自然就顺理成章奔着按钮去了!我们可以编写一个(或者多个)按钮,对其编写OnSelect事件,将需要复用的代码片段都丢进去。然后在需要调用的地方执行
Select(按钮名)
就可以了。这样无论多少处调用,都执行的是这一处按钮编写的代码。
但是这样做并不完美,以下问题需要小心处理
1、不要写出死循环来了。
如,按钮1中编写了需要复用的代码,依赖于下拉框2,而下拉框的OnChange时候企图执行 Select(按钮1),这种死循环是不允许的。不过编辑器会为我们发现这种情况,我们只需要注意斟酌代码的复用性就好
2、Select的效果是异步的
这个坑比较大,而且效果隐蔽难以察觉。举例来说,我有两端需要复用的代码,分别编写在按钮1和按钮2中。
Select(按钮1);
Select(按钮2);
当我试图执行以上代码的时候,两者并不是顺序执行的。也就是说按钮2中的代码已经执行完成,按钮1中的代码可能还在执行中。如果有变量同时被两者依赖,情况会变得极为诡异,因为故障可能呈现为偶发形态。
3、没有参数、没有返回值
一望可知,使用按钮代替函数执行,仅仅是一种变通,而不是真的函数。输入输出就别指望了。结合第二条,实际上能做的复用程度有限。
4、作用域不能跨Screen
即只能是局部“函数”效果,不可以做全局“函数”。毕竟是触发控件生效的,控件的作用域决定了它不可以全局复用。
5、不美观,不方便
多出来的按钮只是一种开发手段,不是真的去给用户使用的。所以我们会需要在发布前,将所有这种按钮给隐藏起来,否则会给用户造成迷惑甚至误操作。而我们开发的时候则需要将其显示出来。显然这是一个非常繁琐的操作。可以按我的个人经验来回避,就是做一个全局bool变量,绑定在这些按钮的Visiable属性上,这样可以一次性修改达到全局显示/隐藏的效果;
虽然有这么多缺点,不过这是仅有的代码复用的手段,属于实战开发中应知应会的技能。不掌握这个小技巧的话,轻则把自己淹没在复制粘贴的混沌代码里,重则对偶发的bug症状束手无策。看我写得这么干货满满,不打算点个赞吗!
更多学习心得、笔记资料传送门
TiDB源码学习笔记:
TiDB源码学习笔记:启动TiDB - 知乎 (zhihu.com)
TiDB源码学习笔记:SQL的一生 - 知乎 (zhihu.com)
PowerApps实战指南:
微软Canvas App实战踩坑指南——事件驱动 or 数据绑定 - 知乎 (zhihu.com)
微软Canvas App实战踩坑指南——undocumented feature - 知乎 (zhihu.com)