我给你讲一个接近真实工业项目规模(10万~20万行代码)的 Qt+C++ 控制软件架构实例。
我会按照 真实工程师的思考过程来讲:
1️⃣ 项目背景
2️⃣ 第一版代码(很混乱)
3️⃣ 第一次架构升级
4️⃣ 第二次架构升级
5️⃣ 第三次架构升级
6️⃣ 最终成熟架构
7️⃣ 真实目录结构(工业级)
8️⃣ 典型代码例子
9️⃣ 一个完整功能如何在架构中流动
你会看到 大型项目其实是一步一步演化出来的。
一、项目背景(真实设备类型)
假设我们做一个 自动光学检测设备(AOI)控制软件。
设备包含:
text
运动平台 (X/Y/Z电机)
工业相机
光源控制
温度传感器
气缸控制
网络通信
数据库
UI界面
功能:
text
设备启动
自动检测流程
运动控制
拍照
图像算法检测
数据存储
远程控制
日志
规模:
text
代码 10万~20万行
开发周期 2~3年
开发人数 5~10人
二、第一版代码(所有人都这么开始)
最初结构通常是:
text
project
├── main.cpp
├── MainWindow.cpp
├── Motor.cpp
├── Camera.cpp
├── Sensor.cpp
├── TcpServer.cpp
└── Algorithm.cpp
UI直接控制设备。
示例代码
UI点击按钮:
cpp
void MainWindow::on_startButton_clicked()
{
motor.moveTo(100);
camera.capture();
double result = algorithm.detect(camera.image());
tcp.sendResult(result);
}
问题:
text
UI
├── 控制运动
├── 控制相机
├── 调用算法
└── 网络发送
UI变成超级类。
三、第一次重构(Controller)
工程师意识到:
UI 不应该控制设备。
于是引入:
text
Controller
新结构
text
project
├── ui
│ └── MainWindow
│
├── controller
│ ├── MotionController
│ ├── CameraController
│ └── InspectionController
│
└── driver
├── MotorDriver
├── CameraDriver
└── SensorDriver
UI代码
变成:
cpp
void MainWindow::on_startInspection_clicked()
{
inspectionController.start();
}
InspectionController
cpp
class InspectionController
{
public:
void start()
{
motion.moveTo(100);
camera.capture();
auto img = camera.getImage();
auto result = algorithm.detect(img);
network.sendResult(result);
}
private:
MotionController motion;
CameraController camera;
DetectionAlgorithm algorithm;
};
UI变简单了。
四、第二次重构(Algorithm层)
随着算法变复杂:
text
缺陷检测
图像滤波
边缘检测
深度学习
Controller变成:
cpp
class InspectionController
{
Filter filter;
EdgeDetector edge;
Classifier ai;
};
问题:
❌ 控制逻辑和算法混在一起
于是拆出:
text
Algorithm
新结构
text
project
├── controller
├── algorithm
└── driver
Algorithm模块
cpp
class DefectDetection
{
public:
Result detect(Image img)
{
img = filter.apply(img);
auto edge = edgeDetector.run(img);
return classifier.predict(edge);
}
};
Controller:
cpp
class InspectionController
{
DefectDetection detector;
};
五、第三次重构(通信系统)
设备需要:
text
远程监控
远程启动
数据上传
通信包括:
text
TCP
串口
Modbus
通信代码开始混乱。
工程师拆成两层:
text
Protocol
Media
Media(传输)
text
TCP
Serial
UDP
示例:
cpp
class TcpServer
{
public:
QByteArray receive();
};
Protocol(协议)
解析命令:
text
START
STOP
SET_SPEED
cpp
class DeviceProtocol
{
public:
Command parse(QByteArray data);
};
流程:
text
TCP
↓
Media
↓
Protocol
↓
Controller
六、第四次重构(Manager)
随着系统变大:
text
MotionController
CameraController
InspectionController
NetworkController
问题:
text
谁创建对象?
谁初始化?
谁管理生命周期?
于是加入:
text
Manager
SystemManager
cpp
class SystemManager
{
public:
void init()
{
motionController.init();
cameraController.init();
networkController.init();
}
void start()
{
inspectionController.start();
}
};
程序入口:
cpp
int main()
{
SystemManager system;
system.init();
system.start();
}
七、第五次重构(Service)
UI越来越复杂:
text
设备控制
数据查询
状态查询
UI不应该直接调用Controller。
于是加入:
text
Service
DeviceService
cpp
class DeviceService
{
public:
void startInspection()
{
inspectionController.start();
}
double getTemperature()
{
return sensorController.readTemp();
}
};
UI:
cpp
deviceService.startInspection();
八、最终成熟架构
大型系统最终会变成:
text
UI
↓
Service
↓
Manager
↓
Controller
↓
Algorithm
↓
Protocol
↓
Media
↓
Driver
↓
Hardware
九、真实工业项目目录(经典)
一个典型 20万行控制软件结构:
text
project
│
├── app
│ └── main.cpp
│
├── ui
│ ├── MainWindow
│ ├── DevicePanel
│ └── StatusWidget
│
├── manager
│ ├── SystemManager
│ ├── DeviceManager
│ └── ThreadManager
│
├── service
│ ├── DeviceService
│ ├── DataService
│ └── ConfigService
│
├── controller
│ ├── MotionController
│ ├── CameraController
│ ├── LightController
│ └── InspectionController
│
├── algorithm
│ ├── Vision
│ ├── Motion
│ └── AI
│
├── protocol
│ ├── Modbus
│ ├── CustomProtocol
│
├── media
│ ├── Tcp
│ ├── Serial
│
├── driver
│ ├── MotorDriver
│ ├── CameraDriver
│ ├── LightDriver
│
├── thread
│ ├── ControlThread
│ ├── NetworkThread
│
└── tools
├── Logger
├── Config
└── Utils
十、一个完整功能如何运行
用户点击:
text
开始检测
系统流程:
text
UI
↓
DeviceService
↓
InspectionController
↓
MotionController
↓
MotorDriver
↓
Motor
拍照:
text
InspectionController
↓
CameraController
↓
CameraDriver
↓
Camera
算法:
text
InspectionController
↓
Algorithm
网络:
text
TCP
↓
Media
↓
Protocol
↓
Controller
十一、大型项目设计的核心思想
大型软件其实只有几个核心原则:
1 单一职责
每个模块只做一件事。
2 分层
text
UI
Service
Controller
Driver
3 解耦
模块之间通过接口通信。
4 可扩展
增加新设备只需:
text
NewController
NewDriver
十二、一句话总结
大型项目架构其实是:
text
简单代码
↓
模块化
↓
分层
↓
服务化
↓
成熟架构
是 不断重构演化出来的。
如果你愿意,我可以再给你讲一个真正非常关键但很多人不知道的东西:
👉 为什么大型项目一定要做"事件驱动架构(Event Bus)"
很多系统(机器人 / 自动驾驶 / 工业设备 / Qt大型软件)都是靠它解决 模块耦合问题。
理解这个,你基本就能看懂 任何大型软件架构。