开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 7665|回复: 124
收起左侧

[易语言纯源码] 易语言结合HashMap实现高级条件判断

[复制链接]
发表于 2023-5-4 13:31:26 | 显示全部楼层 |阅读模式   山西省忻州市
本帖最后由 老男孩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. 子程序指针与整数型的相互转化

易语言的特殊命令支持库和拓展功能支持库提供的这三条命令对实现这种映射操作提供了很好的支持,如下图所示
p9tVDSg.png
特殊命令支持库提供了子程序指针和整数型的转化的能力,而拓展功能支持库提供了执行子程序的能力(利用子程序指针)
这部分使用大家应该自己去易语言看看就能明白,这里就不在赘述了。具体代码我会在帖子中给出,原理很简单,大家一看就懂了。




  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
变量名类 型数组备 注
mapHashMap_StrInt  

子程序名返回值类型公开备 注
_按钮1_被单击  
变量名类 型静态数组备 注
子程序子程序指针 
子程序名字文本型 
子程序名字 = 组合框1.取项目文本 (组合框1.现行选中项)
子程序 = 整数型到子程序指针 (map.取值 (子程序名字, ))
调试输出 (子程序)
执行子程序 (子程序, 编辑框2.内容)
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
初始化哈希表 ()
组合框1.加入项目 (“msgbox”, )
组合框1.加入项目 (“tssc”, )
子程序名返回值类型公开备 注
msgbox  
参数名类 型参考可空数组备 注
msg文本型
信息框 (msg, 0, , )
子程序名返回值类型公开备 注
tssc  
参数名类 型参考可空数组备 注
text文本型
调试输出 (text)
子程序名返回值类型公开备 注
初始化哈希表 该处内容一般用来注册处理函数
map.初始化 ()
map.加入 (“msgbox”, 子程序指针到整数型 (&msgbox), )
map.加入 (“tssc”, 子程序指针到整数型 (&tssc), )


i支持库列表   支持库注释   
TianSin(未知支持库)
spec特殊功能支持库
shellEx扩展功能支持库一

易语言反射.e

928.93 KB, 下载次数: 103, 下载积分: 精币 -2 枚

1683174956796.jpg

评分

参与人数 9好评 +4 精币 +18 收起 理由
wa690602724 + 1 感谢分享,很给力!~
易语言资源网 + 1 + 3 开源精神必须支持~
cbl521ysys + 1 感谢分享,很给力!~
3awen + 1 + 2 与精益模块HashMap_StrInt,有什么不同
※逍遥游※ + 1 感谢分享,很给力!~
网络注册会员 + 1 + 2 支持开源~!感谢分享
kyo9766 + 2 感谢分享,很给力!~
冰点 + 1 + 3 感谢分享,很给力!~
空竹 + 3 支持开源~!感谢分享

查看全部评分


本帖被以下淘专辑推荐:

签到天数: 10 天

发表于 2024-6-21 17:06:11 | 显示全部楼层   陕西省咸阳市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

发表于 2023-5-28 13:06:46 | 显示全部楼层   湖北省武汉市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 11 天

发表于 2023-5-22 16:10:22 | 显示全部楼层   湖北省随州市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

发表于 2023-5-22 16:08:14 | 显示全部楼层   福建省厦门市
不错,看看代码
回复 支持 反对

使用道具 举报

结帖率:60% (6/10)

签到天数: 4 天

发表于 2023-5-22 11:11:45 | 显示全部楼层   广东省佛山市
感谢分享了,学习了~~~~~~~~~
回复 支持 反对

使用道具 举报

结帖率:100% (7/7)

签到天数: 1 天

发表于 2023-5-21 22:10:04 高大上手机用户 | 显示全部楼层   广东省广州市
        感谢分享,很给力!~
回复 支持 反对

使用道具 举报

结帖率:100% (1/1)

签到天数: 5 天

发表于 2023-5-21 03:21:55 | 显示全部楼层   山东省烟台市
值得学习学习
回复 支持 反对

使用道具 举报

结帖率:95% (40/42)

签到天数: 16 天

发表于 2023-5-20 21:32:45 | 显示全部楼层   广东省揭阳市
看看               
回复 支持 反对

使用道具 举报

结帖率:94% (29/31)

签到天数: 1 天

发表于 2023-5-19 23:30:18 | 显示全部楼层   河南省郑州市
可能看啊!!!!!!!!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表