为多具体实现定义API:基类函数参数设计方案咨询
配置隔离与API统一的设计问题
我需要实现多个共享同一API的具体类,这些类基础功能一致,但支持包含共享配置项的不同类型配置,同时要尽可能隔离各具体类的实现。为此我设计了抽象基类AbstractA来定义API,但不确定如何定义函数参数,目前提出两种方案:
方案1:包含所有可能配置项的通用配置类
优点
- 所有实现拥有统一的API
缺点
- API会暗示支持某些实际不支持的配置(未来可能支持),需通过文档说明或在误用时报错
- 新增配置项时,现有其他具体类无法适配该新项
代码示例:
from dataclasses import dataclass from typing import Optional from abc import ABC, abstractmethod @dataclass class CommonCfg: cfg_1: Optional[int] = None cfg_2: Optional[int] = None cfg_3: Optional[int] = None class AbstractA(ABC): @abstractmethod def func_z(self, cfg: CommonCfg): pass class B(AbstractA): def func_z(self, cfg: CommonCfg): # 不使用`cfg_3` pass class C(AbstractA): def func_z(self, cfg: CommonCfg): # 不使用`cfg_2` pass
方案2:基类使用泛型签名
基类基于泛型定义参数类型,子类ClassB和ClassC的func_z分别接收各自的专属配置类CfgB和CfgC。
代码示例:
from abc import ABC from typing import Generic, TypeVar, Optional CfgType = TypeVar('CfgType') class AbstractA(ABC, Generic[CfgType]): @abstractmethod def func_z(self, cfg: CfgType): pass # 子类专属配置与实现 class CfgB: cfg_1: Optional[int] = None cfg_2: Optional[int] = None class ClassB(AbstractA[CfgB]): def func_z(self, cfg: CfgB): pass class CfgC: cfg_1: Optional[int] = None cfg_3: Optional[int] = None class ClassC(AbstractA[CfgC]): def func_z(self, cfg: CfgC): pass
理想场景
仅涉及通用配置时,能无缝替换不同具体实现的对象,示例如下:
b = ClassB() c = ClassC() # 仅包含共享配置项的通用配置类 class CommonCfg: cfg_1: Optional[int] = None cfg = CommonCfg() b.func_z(cfg) # 期望无负担替换为: # c.func_z(cfg)
内容的提问来源于stack exchange,提问作者Guti_Haz
相关产品推荐
相关产品推荐

