MVC 架构
MVC 是一种经典的软件架构设计模式,全称是 Model(模型)- View(视图)- Controller(控制器)。它通过将软件系统划分为三个核心部分,实现了数据、界面和业务逻辑的分离,从而提高代码的可维护性、可扩展性和复用性。
在深度学习可视化 App 这类应用中,MVC 模式能清晰划分各模块职责,非常适合你的开发场景。
MVC 三部分的核心职责
- Model(模型)
核心作用:负责管理应用的核心数据和业务逻辑,是应用的 “数据中心”。
具体职责:
存储数据(如训练参数、日志信息、模型性能指标等)。
处理数据逻辑(如参数校验、从 YAML 文件读写配置、计算训练指标等)。
当数据发生变化时,通知相关方(通常是控制器或视图)。
举例(你的场景):
训练参数类(ParameterConfig):存储学习率、批次大小等参数,提供校验和 YAML 读写方法。
日志管理器(LogSystem):负责日志的存储、格式化和写入文件。
训练数据处理器:处理数据集加载、预处理等逻辑。 - View(视图)
核心作用:负责数据的展示和用户交互,是用户看到的 “界面层”。
具体职责:
展示 Model 中的数据(如用图表显示损失曲线、用文本框显示日志)。
接收用户输入(如按钮点击、参数修改),并将交互事件传递给 Controller。
不处理业务逻辑,仅负责 “展示” 和 “转发交互”。
举例(你的场景):
PySide6 中的界面组件(QMainWindow、QTabWidget、图表控件等)。
界面布局管理(如配置面板、日志面板的摆放)。
用户操作控件(如 “开始训练” 按钮、参数输入框)。 - Controller(控制器)
核心作用:作为 Model 和 View 之间的 “桥梁”,协调两者的交互。
具体职责:
接收 View 传递的用户交互事件(如点击 “开始训练”)。
根据事件逻辑调用 Model 进行数据处理(如启动训练、更新参数)。
当 Model 数据变化后,通知 View 更新展示(如 epoch 结束后刷新图表)。
举例(你的场景):
TrainingController 类:接收界面的 “开始训练” 信号,调用模型的训练方法,训练过程中通过信号通知视图更新日志和图表。
处理参数校验逻辑:当用户输入参数后,控制器调用 Model 的校验方法,再让 View 显示校验结果(如错误提示)。
MVC 的工作流程(以你的训练 App 为例)
用户交互:用户在 View(界面)中点击 “开始训练” 按钮。
View 转发事件:View 将点击事件传递给 Controller(如 controller.start_training())。
Controller 处理逻辑:
调用 Model 加载训练参数(如从 ParameterConfig 取参数)。
调用 Model 启动训练(如训练线程)。
Model 处理数据:训练过程中,Model 计算损失、准确率等指标,更新内部数据,并通知 Controller。
Controller 通知 View 更新:
Controller 接收 Model 的数据变化(如 epoch 完成信号)。
通过信号(如 update_chart_signal)通知 View 刷新图表、日志等。
View 展示新数据:View 根据 Controller 的通知,更新界面显示(如损失曲线、实时日志)。
MVC 的优势(为什么适合你的项目)
职责分离:
界面(View)和逻辑(Model/Controller)分开,修改界面时无需改动训练逻辑,反之亦然。
例如:想换一种图表展示方式,只需修改 View,Model 和 Controller 不变。
代码复用:
Model 中的数据处理逻辑(如参数校验、日志管理)可复用于其他界面或模块。
便于协作:
可以分工开发:一人负责界面(View),一人负责训练逻辑(Model),通过 Controller 对接。
可测试性:
可单独测试 Model 的业务逻辑(如参数校验是否正确),无需依赖界面。
总结
在你的深度学习可视化 App 中:
Model 管数据(参数、日志、指标)和核心逻辑(训练、校验)。
View 管界面(PySide6 组件)和用户交互(按钮、输入)。
Controller 管协调(接收交互→调 Model→通知 View 更新)。
这种架构能让你的代码结构更清晰,尤其在后续需要扩展功能(如增加新的可视化图表、支持新模型)时,维护成本会显著降低。