【发布时间】:2020-12-06 17:36:47
【问题描述】:
这可能是一个见仁见智的问题,但由于我主要是自学成才,我想征求意见。我有一个输入,然后是一个路由方法,然后是处理路由的单个方法,如下所示:
# Use first char as prefix for routing.
typ_pfx = input[0]
inb_typ_handler(typ_pfx)
#=== Routing ===#
def _inb_typ_handler(self, typ_pfx):
try:
typ_pfx = typ_pfx.upper()
if typ_pfx == 'M':
# Default. Prints to screen.
self._m_handler()
elif typ_pfx == 'C':
# Incoming controller message.
self._c_handler()
elif typ_pfx == 'S':
# Server messages.
self._s_handler()
elif typ_pfx == 'U':
# Misc handler....
self._u_handler()
# ...
# ... omitted for succinctness
# ...
else:
print('Prefix: ', typ_pfx)
print('-x- Unknown message type error.')
except:
pass
#=== Handlers ===#
def _m_handler(self):
"""Standard message. Unpacks message, and prints screen."""
trim_msg = self.unpack_msg(serv_sock)
self.print_message(trim_msg, enc=self.encrypt_traffic)
def _c_handler(self):
"""Control messages from another user. Not displayed."""
self.unpack_msg(serv_sock)
def _s_handler(self):
"""Server announcements."""
msg = self.unpack_msg(serv_sock).decode()
msg = f"@YO: {msg}"
self.print_message(msg, style_name='BLUEGREY')
# ... And so on and so forth.
现在,它们都在同一个类中,在主文件上(用于套接字客户端)。
我的第一直觉是将路由器移动到模块文件,将处理程序移动到单独的模块文件,然后import它们。
所以 inb_typ_handler 会像 socketIO 模块一样被导入,然后这些模块会进入它们自己的处理程序模块。
我想知道,有没有其他方法来处理这个问题,让它更干净或更好地组织它,因为我的处理程序和路由器的数量一直在增加,而且它目前正处于在向后滚动时很容易迷路的地步第四次。
他们使用字母作为前缀代码,但我将它们按功能分组,而不是按字母顺序。我听说过@decorators,但从未使用过它们,有什么方法可以应用它们来帮助组织我的处理程序吗?
我还能做些什么来使代码简洁易读?
【问题讨论】:
-
您可以创建一个字典,将
typ_pfx值映射到不同的方法。这会更快,因为路由被简化为简单的字典查找操作。 -
哦,太棒了!那么它究竟是如何工作的呢?函数 = routing_dict[typ_pfx]?如何从字典中调用函数?我也可以将参数传递给函数吗?
-
是的,就是这个想法 - 请参阅我添加的详细答案。
标签: python code-organization project-organization