Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用事件而不是switch语句是否有客观上更可取的理由?_Node.js - Fatal编程技术网

Node.js 使用事件而不是switch语句是否有客观上更可取的理由?

Node.js 使用事件而不是switch语句是否有客观上更可取的理由?,node.js,Node.js,我将通过首先描述我的用例来澄清我的问题: 我正在编写一个IMAP服务器,它接收来自客户端的命令。如果处于正确的状态,它将从网络套接字读取令牌,并将该令牌解释为命令名。现在,我的服务器从令牌中读取命令名,并使用switch语句执行相应的代码 以下是它的一瞥: 案例能力:this.executeCapabilitytag;打破 case NOOP:this.executeNooptag;打破 案例注销:this.executelouguttag;打破 案例登录:this.executeLoginta

我将通过首先描述我的用例来澄清我的问题:

我正在编写一个IMAP服务器,它接收来自客户端的命令。如果处于正确的状态,它将从网络套接字读取令牌,并将该令牌解释为命令名。现在,我的服务器从令牌中读取命令名,并使用switch语句执行相应的代码

以下是它的一瞥:

案例能力:this.executeCapabilitytag;打破 case NOOP:this.executeNooptag;打破 案例注销:this.executelouguttag;打破 案例登录:this.executeLogintag,args;打破 我的问题是:是否有客观上更可取的理由使用事件来发送命令?性能会更好吗?有安全优势吗

我提议的替代方案可能如下所示:

server.onCAPABILITY,可执行性; server.onNOOP,executeNoop; server.onLOGOUT,executeloout; server.onLOGIN,executeLogin;
事件更容易被其他代码扩展和使用。他们生活在一个系统中,该系统的基础设施已经存在,任何其他人都可以监听这些事件。如果您正在调用一个函数,传递一个参数,然后使用switch语句进行分派,那么这是一个自定义的、非标准的接口。如果您自己的代码的其他部分希望侦听其中一个事件并自己执行操作,那么他们必须构建一些自己的自定义代码来实现这一点

如果您使用事件,那么基础设施已经存在。他们可以用自己的监听器监听事件

这里有一个小例子。假设出于性能原因,您正在为每个用户缓存数据库中的一些数据。当用户注销时,您希望清除缓存。您的缓存系统是自己的模块,因为它可以在其他应用程序中重用。如果使用事件,缓存可以为注销事件设置自己的事件侦听器,并在给定用户注销时执行自己的内务管理。在交换机设计中,您可能需要在executelougout函数中插入代码来调用缓存中的某个方法。这会起作用,但代码不会像它可能的那样被封装。现在,在注销方法中有了缓存逻辑,在事件系统中不需要缓存逻辑,因为缓存可以自己监视它感兴趣的所有事件

我并不是说这是一个致命的例子,意味着你必须这样或那样做。只是展示了事件的一些体系结构优势,它允许子系统更容易地访问事件,以便它们能够更轻松地管理自己的封装代码


我不认为会有一个有意义的性能差异。如果您处于一个严格的性能敏感循环中,那么事件子系统可能会引入更多的函数调用来分派而不是switch语句,但是对于常规代码来说,这并不是重要的。

这是我甚至没有考虑过的一个要点:模块化/封装!非常感谢。