我有一个队列,我正在向它推送消息。消息有一个唯一的整数ID。我基本上有这样的东西:
#-------------------------
#Message handlers
#-------------------------
def noOperation():
print "Do nothing"
def msgHandler1():
print "Handling message with ID = 1"
def msgHandler2():
print "Handling message with ID = 2"
#-------------------------
#Message lookup table
#-------------------------
lookupTable = {
0: noOperation,
1: msgHandler1,
2: msgHandler2
#...etc...
}
#-------------------------
#Message processing
#-------------------------
while threadActive:
message = buffer.get(block=True)
if message:
lookupTable[message.id]()
我的问题是:有没有更有效的方法来做这类事情?如果我有几十种消息类型(或者,为了论证起见,假设消息类型的数量是无限的,并且会随着时间的推移继续增长),那么我的查找表会变得很大。也许这真的不是问题——我不确定。。。创建这样一个映射到数十个消息处理程序方法的大表,感觉有点不对。这类事情是一个众所周知的问题,有一个定义明确的解决方案吗?这上面有什么图案吗?
我认为你的方式是最好的方式。最接近的设计模式是命令模式。这或多或少就是您在python中实现它的方式。我并不担心你的查询表会太大。我将在您的代码中建议的唯一更改是以下
if message.id in lookupTable:
lookupTable[message.id]()
else:
print "invalid id"
这样就可以处理else
中的默认情况
如果您的ID是连续的,那么最好使用一个可以直接访问的简单列表。这样就不用查字典了。
lookupTable = [
noOperation, # index 0
msgHandler1, # index 1
msgHandler2 # index 2 etc
]
while threadActive:
message = buffer.get(block=True)
if message:
try:
lookupTable[message.id]()
except IndexError:
print 'unknown id {}'.format(message.id)
在Python中,最好尝试使用索引并捕获异常,而不是首先测试它是否有效。这将导致更快的代码。此外,不要使用in
,因为这将对数组进行线性搜索。