易语言资源网 - 做最全的易语言资源下载社区
精易论坛授权登录

易语言结合HashMap实现高级条件判断   [复制链接]

    2023-05-10 16:09:35
    高级教程源码
    易语言资源网
    2590 次浏览
    来源链接


引言

坛友们在使用其他编程语言的时候应该见过利用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实际上就是个哈希表,你可以简单地理解为如下表

TextInt
TextInt
TextInt
TextInt
TextInt

当你插入值的时候,你需要插入一对键和值,插入上表,比如插入

(msgbox,1)

这张表就会变成

msgbox1
TextInt
TextInt
TextInt
TextInt

而你要取到这个值,只需提供键,就能返回对应的值,例如

\> map.get("msgbox")
\> 1

在易语言中,首先你需要加一个HashMap_StrInt类型的变量

.版本 2

.程序集 窗口程序集_启动窗口
.程序集变量 map, HashMap_StrInt

接下来初始化它

map.初始化 ()

存入数据

注意:后面的“真”意思是禁止覆盖相同键

map.加入 (“msgbox”, 1, 真)

取值

map.取值 (“msgbox”, )

2. 子程序指针与整数型的相互转化

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



点我下载 (已有 49 次下载)

引用模块


源码文件名 模块文件名
易语言反射.e
精易模块.ec


引用支持库


源码文件名 支持库文件名 支持库标识
易语言反射.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
特殊命令支持库 1.4 {15EB1853-EE4C-468f-BAA5-63D186FDB911}
扩展功能支持库一 3.0 DA19AC3ADD2F4121AAD84AC5FBCAFC71


[错误报告]   上一篇:GDIP黏黏油漆实现,液体张力实现,GD...     下一篇:excel表格添加XML映射 ...