用注册表消灭 if-else:在线工具模块的插拔式设计
新增工具时只新增一个处理器文件,路由、服务与页面都不需要改——这就是开闭原则的实际收益。
用注册表消灭 if-else:在线工具模块的插拔式设计
在线工具模块最容易写成巨型 if tool_name == ...。每加一个工具,路由、校验、前端都要改一遍,典型的霰弹式修改。
抽象出处理器接口
class BaseTool(ABC):
slug: str
name: str
fields: tuple[ToolField, ...]
@abstractmethod
def execute(self, payload: Mapping[str, str]) -> ToolResult:
...
处理器只关心「输入 → 输出」,不接触请求对象,也不处理权限。
自动发现而不是手工注册
注册表遍历 handlers 包,导入模块后收集所有 BaseTool 子类:
for module in pkgutil.iter_modules(package.__path__):
importlib.import_module(f"{package.__name__}.{module.name}")
新增工具只需新增文件,注册表自动接管。
服务层统一横切能力
参数校验、会员权限、每日配额、使用审计都在服务层完成:
权限 → 校验 → 配额 → 执行 → 审计
处理器因此可以保持极简,测试也只需要构造一个字典。
结果
新增工具的成本从一个「跨文件改动」变成「新增一个文件」。这就是可扩展性的可度量定义。