本帖最后由 老男孩0001 于 2023-5-4 13:31 编辑
引言
坛友们在使用其他编程语言的时候应该见过利用Map或者对象映射来省去if判断的情况把,在不少的服务器端软件中以及协议中这是很常见的操作,尤其是在Chrome开发者工具的底层协议的实现上,这个技术被用的很多,可见这种技术是多么的受欢迎,总而言之,这么写总比你写一堆判断在那好吧,看着不辣眼睛吗。我提倡大家遇到那种特别多的if判断的时候选择用这种方法。
本实例借用了精易模块的HashMap_StrInt类来存储字符串与子程序指针的映射,实现了字符串获取子程序并执行这种类似Java反射的功能,从而使易语言也能实现那种高级的判断。
在其他变成语言中的体现
这种现象在其他语言中是相当常见的,正如我上面说的,Chrome开发者工具的底层协议的实现正是使用的这种方法,以及一些通信协议的处理就喜欢用这种方式,我这里给出Python和Javascript的示例,让大家先感受一下这种写法的优势。
Javascript示例
代码在改写前是这样的
/***
* 在修改以前,你可能这样写判断
* home.php?mod=space&uid=275307 cmd 输入参数
*/
function obj_if(cmd) {
if (cmd === 'a'){
// 这里是一堆业务代码
console.log('a')
}else if (cmd === 'b'){
// 这里是一堆业务代码
console.log('b')
}else {
// 这里是一堆业务代码
console.log('etc')
}
}
改写后
// 由此来编写各种处理函数
function a(){
// 这里是一堆业务代码
console.log('a')
}
function b(){
// 这里是一堆业务代码
console.log('b')
}
function etc(){
// 这里是一堆业务代码
console.log('etc')
}
// 由此来注册各种处理函数
cmd_obj = {
"a": a,
"b": b,
"etc": etc
}
/***
* 在修改以后,你可能这样写判断
* @param cmd 输入参数
*/
function obj_if(cmd) {
cmd_obj[cmd]()
}
Python示例
代码在改写前是这样的
"""
在未改写前,你可能会用这种方式来处理问题
"""
cmd = input()
cmd = cmd.strip()
if cmd == "a":
"""
这里是一堆某某代码
"""
print("a")
elif cmd == "b":
"""
这里是一堆某某代码
"""
print("b")
else:
"""
这里是一堆某某代码
"""
print("etc...")
"""
如果你真有耐心,你可以这样一直写下去
"""
改写后
"""
在改写后,代码变成了以下这种
python中的思路是python的字典可以存档这种函数类型,因此可以使用字典来实现映射的效果
"""
# 由此处为每段逻辑定义独立的函数
def fun_a():
print("a")
def fun_b():
print("b")
def fun_etc():
print("etc")
# 由此处注册处理函数
cmds = {
"a": fun_a,
"b": fun_b,
"etc": fun_etc
}
# 由此处执行判断逻辑
cmd = input()
cmd = cmd.strip()
cmds[cmd]()
以上内容可见,改写过程其实还是较为复杂的,但是是值得的,当你需要判断的量足够大时,这种映射的方式你拓展程序会变得舒服的很多,还可以把部分逻辑代码摘出来写,从而提高你代码的健壮性。
易语言实现
易语言本身并没有带这种映射的数据结构,精易模块提供了一种HashMap,可以实现这种功能,在此前,你要理解两部分知识点。
1. HashMap_StrInt的使用
HashMap_StrInt实际上就是个哈希表,你可以简单地理解为如下表
键 |
值 |
Text |
Int |
Text |
Int |
Text |
Int |
Text |
Int |
Text |
Int |
当你插入值的时候,你需要插入一对键和值,插入上表,比如插入
(msgbox,1)
这张表就会变成
键 |
值 |
msgbox |
1 |
Text |
Int |
Text |
Int |
Text |
Int |
Text |
Int |
而你要取到这个值,只需提供键,就能返回对应的值,例如
\> map.get("msgbox")
\> 1
在易语言中,首先你需要加一个HashMap_StrInt类型的变量
.版本 2
.程序集 窗口程序集_启动窗口
.程序集变量 map, HashMap_StrInt
接下来初始化它
map.初始化 ()
存入数据
注意:后面的“真”意思是禁止覆盖相同键
map.加入 (“msgbox”, 1, 真)
取值
map.取值 (“msgbox”, )
2. 子程序指针与整数型的相互转化
易语言的特殊命令支持库和拓展功能支持库提供的这三条命令对实现这种映射操作提供了很好的支持,如下图所示
特殊命令支持库提供了子程序指针和整数型的转化的能力,而拓展功能支持库提供了执行子程序的能力(利用子程序指针)
这部分使用大家应该自己去易语言看看就能明白,这里就不在赘述了。具体代码我会在帖子中给出,原理很简单,大家一看就懂了。
窗口程序集名 | 保 留 | 保 留 | 备 注 | 窗口程序集_启动窗口 | | | | 变量名 | 类 型 | 数组 | 备 注 | map | HashMap_StrInt | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | 子程序 | 子程序指针 | | | 子程序名字 | 文本型 | | |
子程序名字 = 组合框1. 取项目文本 (组合框1.现行选中项 )子程序 = 整数型到子程序指针 (map. 取值 (子程序名字, )) 调试输出 (子程序 )执行子程序 (子程序, 编辑框2.内容 )初始化哈希表 ()组合框1. 加入项目 (“msgbox”, )组合框1. 加入项目 (“tssc”, )信息框 (msg, 0, , )调试输出 (text )map. 初始化 ()map. 加入 (“msgbox”, 子程序指针到整数型 (&msgbox ), 真)map. 加入 (“tssc”, 子程序指针到整数型 (&tssc ), 真)|
TianSin | (未知支持库) | spec | shellEx |
|