正确管理(突发的)客户特定配置的方法
处理金融软件客户定制需求的最佳实践探讨
场景背景
我们公司为金融领域特定细分市场打造软件解决方案,现有约20家客户。除核心功能外,系统几乎所有模块都因不同客户需求做过定制修改,且这类需求大多难以预判,完全取决于客户偏好。
我正探索软件开发中处理客户特定需求的合理方式,以下示例均来自我日常编码遇到的问题。
过去,我们通常直接在函数内修改代码:
def do_important_thing(client_name, *args): # ... do something here # Hack for the client request: if client_name == "client1": # ... do something a bit different else: # ... do it the old way # ... do a bit more return
这种方式常演变为冗长的if/elif/else语句,且分散在代码多处。我始终认为该方法并非最优,虽已移除大量此类语句,但复杂功能相关的仍未清理完毕。
在新项目中,我尝试采用客户配置文件,将客户需求抽象为通用配置项:
def do_important_thing(client_name: str, client_configurations: dict, *args): # ... do something here # Hack for the client request: if client_configurations.get("use_do_something_different"): # ... do something a bit different else: # ... do it the old way # ... do a bit more return
客户端配置会在模块启动时加载,并在函数间传递:
def load_configurations(client_name: str) -> dict: """This is usually stored on a database or a dedicated config file""" configuration_data = { "client1": {"use_do_something_different": True} } return configuration_data.get(client_name, {}) def main(client_name, *args): # Load configs client_configurations = load_configurations(client_name) # Run functions do_important_thing(client_name, client_configurations, *args)
目前该方案效果尚可(欢迎提供改进建议),但在处理更复杂功能时遇到瓶颈。
问题难点
以报表生成模块为例:
class ReportGenerator: ... def generate(): """abstract method""" class DefaultReportGenerator(ReportGenerator): ... def generate(): """default implementation""" ...
若某客户要求彻底修改报表,且无法通过配置项实现,我会针对需求创建新函数或类,例如:
class Client1ReportGenerator(DefaultReportGenerator): ... def generate(): """client1 implementation""" ...
是否需要将该类的映射关系也写入客户配置文件?示例如下:
def main(client_name): configuration_data = { "client1": { "report_generator": Client1ReportGenerator } } client_configuration = configuration_data.get(client_name, {}) # pick engine report_generator = client_configuration.get(client_name, DefaultReportGenerator) # run report report_generator().generate()
核心问题
我非常期待各位的反馈,同时希望得到以下三个问题的解答:
- 配置文件方案是否存在明显弊端?
- 针对多模块的大型代码库,应采用集中式配置文件还是分模块配置文件?
- 是否有更优方案可同时管理传统配置文件与客户定制功能(尤其是旧版本配置文件难以存入数据库的情况)?
感谢各位!
如前文所述,我尝试在各模块使用硬编码配置文件,将配置项与功能映射统一管理。
内容的提问来源于stack exchange,提问作者NiProgramador
相关产品推荐
相关产品推荐

