处理多种方法之间路由的组织方法

问题描述

这可能是一个见解,但由于我大多是自学成才,所以我想征求意见。我有一个输入,然后是一个路由方法,然后是各个方法来处理路由,如下所示:

# 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

因此,将像从socketIO模块中导入inb_typ_handler一样,然后将这些模块放入自己的处理程序模块中。

我想知道,还有其他方法可以处理它,使其变得更整洁或组织得更好,因为我的处理程序和路由器的数量一直在不断增加,并且目前正处在回滚和滚动时容易丢失的地步

他们使用字母作为前缀代码,但我按功能将它们分组,而不是按字母顺序排列。我听说过@decorators,但从未使用过它们,有什么方法可以应用这些东西来帮助组织处理程序?

我还能做些什么来使代码清晰易读吗?

解决方法

以下是实现我在注释中建议的内容的方法(基于您的示例代码):

class Foobar:
    def inb_typ_handler(self,typ_pfx):
        handler = self.routing_dict.get(typ_pfx.upper(),type(self)._error_handler)
        handler(self,typ_pfx)

    def _m_handler(self,typ_pfx):
        """Standard message. Unpacks message,and prints screen."""
        print('In _m_handler()')

    def _c_handler(self,typ_pfx):
        """Control messages from another user. Not displayed."""
        print('In _c_handler()')

    def _s_handler(self,typ_pfx):
        """Server announcements."""
        print('In _s_handler()')

    def _error_handler(self,typ_pfx):
        raise RuntimeError(f'Unknown message type error: "{typ_pfx}"')

    routing_dict = {  # Create method routing table for class.
        'M': _m_handler,'C': _c_handler,'S': _s_handler,}


# Sample usage.
foobar = Foobar()
foobar.inb_typ_handler('m')
foobar.inb_typ_handler('s')
foobar.inb_typ_handler('x')    # An invalid message type.

以上示例产生的输出:

In _m_handler()
In _s_handler()
Traceback (most recent call last):
  File "routing_example.py",line 39,in <module>
    foobar.inb_typ_handler('x')
  File "routing_example.py",line 9,in inb_typ_handler
    handler(self,typ_pfx)
  File "routing_example.py",line 24,in _error_handler
    raise RuntimeError(f'Unknown message type error: "{typ_pfx}"')
RuntimeError: Unknown message type error: "x"

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...