Qt+C++ 控制软件架构实例
我给你讲一个接近真实工业项目规模10万~20万行代码的 QtC 控制软件架构实例。我会按照真实工程师的思考过程来讲1️⃣ 项目背景2️⃣ 第一版代码很混乱3️⃣ 第一次架构升级4️⃣ 第二次架构升级5️⃣ 第三次架构升级6️⃣ 最终成熟架构7️⃣ 真实目录结构工业级8️⃣ 典型代码例子9️⃣ 一个完整功能如何在架构中流动你会看到大型项目其实是一步一步演化出来的。一、项目背景真实设备类型假设我们做一个自动光学检测设备AOI控制软件。设备包含运动平台 (X/Y/Z电机) 工业相机 光源控制 温度传感器 气缸控制 网络通信 数据库 UI界面功能设备启动 自动检测流程 运动控制 拍照 图像算法检测 数据存储 远程控制 日志规模代码 10万~20万行 开发周期 2~3年 开发人数 5~10人二、第一版代码所有人都这么开始最初结构通常是project ├── main.cpp ├── MainWindow.cpp ├── Motor.cpp ├── Camera.cpp ├── Sensor.cpp ├── TcpServer.cpp └── Algorithm.cppUI直接控制设备。示例代码UI点击按钮voidMainWindow::on_startButton_clicked(){motor.moveTo(100);camera.capture();doubleresultalgorithm.detect(camera.image());tcp.sendResult(result);}问题UI ├── 控制运动 ├── 控制相机 ├── 调用算法 └── 网络发送UI变成超级类。三、第一次重构Controller工程师意识到UI 不应该控制设备。于是引入Controller新结构project ├── ui │ └── MainWindow │ ├── controller │ ├── MotionController │ ├── CameraController │ └── InspectionController │ └── driver ├── MotorDriver ├── CameraDriver └── SensorDriverUI代码变成voidMainWindow::on_startInspection_clicked(){inspectionController.start();}InspectionControllerclassInspectionController{public:voidstart(){motion.moveTo(100);camera.capture();autoimgcamera.getImage();autoresultalgorithm.detect(img);network.sendResult(result);}private:MotionController motion;CameraController camera;DetectionAlgorithm algorithm;};UI变简单了。四、第二次重构Algorithm层随着算法变复杂缺陷检测 图像滤波 边缘检测 深度学习Controller变成classInspectionController{Filter filter;EdgeDetector edge;Classifier ai;};问题❌ 控制逻辑和算法混在一起于是拆出Algorithm新结构project ├── controller ├── algorithm └── driverAlgorithm模块classDefectDetection{public:Resultdetect(Image img){imgfilter.apply(img);autoedgeedgeDetector.run(img);returnclassifier.predict(edge);}};ControllerclassInspectionController{DefectDetection detector;};五、第三次重构通信系统设备需要远程监控 远程启动 数据上传通信包括TCP 串口 Modbus通信代码开始混乱。工程师拆成两层Protocol MediaMedia传输TCP Serial UDP示例classTcpServer{public:QByteArrayreceive();};Protocol协议解析命令START STOP SET_SPEEDclassDeviceProtocol{public:Commandparse(QByteArray data);};流程TCP ↓ Media ↓ Protocol ↓ Controller六、第四次重构Manager随着系统变大MotionController CameraController InspectionController NetworkController问题谁创建对象 谁初始化 谁管理生命周期于是加入ManagerSystemManagerclassSystemManager{public:voidinit(){motionController.init();cameraController.init();networkController.init();}voidstart(){inspectionController.start();}};程序入口intmain(){SystemManager system;system.init();system.start();}七、第五次重构ServiceUI越来越复杂设备控制 数据查询 状态查询UI不应该直接调用Controller。于是加入ServiceDeviceServiceclassDeviceService{public:voidstartInspection(){inspectionController.start();}doublegetTemperature(){returnsensorController.readTemp();}};UIdeviceService.startInspection();八、最终成熟架构大型系统最终会变成UI ↓ Service ↓ Manager ↓ Controller ↓ Algorithm ↓ Protocol ↓ Media ↓ Driver ↓ Hardware九、真实工业项目目录经典一个典型20万行控制软件结构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十、一个完整功能如何运行用户点击开始检测系统流程UI ↓ DeviceService ↓ InspectionController ↓ MotionController ↓ MotorDriver ↓ Motor拍照InspectionController ↓ CameraController ↓ CameraDriver ↓ Camera算法InspectionController ↓ Algorithm网络TCP ↓ Media ↓ Protocol ↓ Controller十一、大型项目设计的核心思想大型软件其实只有几个核心原则1 单一职责每个模块只做一件事。2 分层UI Service Controller Driver3 解耦模块之间通过接口通信。4 可扩展增加新设备只需NewController NewDriver十二、一句话总结大型项目架构其实是简单代码 ↓ 模块化 ↓ 分层 ↓ 服务化 ↓ 成熟架构是不断重构演化出来的。如果你愿意我可以再给你讲一个真正非常关键但很多人不知道的东西为什么大型项目一定要做“事件驱动架构Event Bus”很多系统机器人 / 自动驾驶 / 工业设备 / Qt大型软件都是靠它解决模块耦合问题。理解这个你基本就能看懂任何大型软件架构。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2417065.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!