c - 源文件之间的最佳功能划分
问题描述
我的 C 程序有两个线程,它们都与两个外部接口交互。一个源文件的代码太多,所以我将它一分为二。什么是正确的分裂?
一个线程MtoD从 IPC 消息队列中取出一条消息,对其进行处理,然后将命令发送到物理接口的驱动程序。另一个线程DtoM接收来自该驱动程序的中断,处理输入,然后将结果以消息的形式发布到 IPC 队列。
将代码一分为二的明显方法是:
- 按线程:两个源文件,MtoD.c 和 DtoM.c,每个都包含一个线程的所有功能 - 但两个文件都必须处理这两个接口
- 按接口:两个源文件,Mc 和 Dc,每个都执行与某个外部接口相关的所有业务 - 但线程通过这两个文件运行。
我的担忧是
- 代码维护。通过线程执行它可以更容易地遵循线程的逻辑(无需在文件之间切换)。但是编写这个面向对象的人可能会将 IPC 队列的接口封装在一个类中,该类在一个文件中,而驱动程序接口在另一个文件中。
- 性能。如果您有目标文件 Mo 和 Do,每个都将只有一个外部库要处理 - 但它们必须在线程执行期间相互调用。这是否会产生任何开销(如果链接器已将它们变成一个二进制文件)?如果您有 MtoD.o 和 DtoM.o,您可以将大多数函数声明为
static
,这可能会启用更多编译器优化。但是他们都需要与外部库的链接吗?
哪种方式是最优的?
解决方案
这是一个有趣的选择,您可能会推荐这两种选择,仅仅是因为两者都有优点和缺点,这在很大程度上取决于一个人如何看待这些。
好的,第三个选项:一个线程?如果我猜对了,您将接口连接到 IPC,那么如果一个线程同时对任一侧的输入做出反应并将其发送到另一侧?我认为您不会以这种方式浪费太多的响应时间,如果有的话,并且您将所有这些都集中在一个地方。如果源太大,您可以查看可以自然分离的类,而不是分离成线程或接口。
推荐阅读
- kubernetes-helm - 用于 kubectl 和 helm 的 RBAC
- node.js - 无法添加cordova-plugin-file-transfer
- html - 在页面上定位特定的 h2
- angular - 单个 AWS S3 存储桶上的多个角度 SPA?
- merge - 我想加入两个 ffmpeg 命令来收集
- autodesk-forge - 警告:“Forge Design Automation v2”API 已弃用,取而代之的是“Forge Design Automation v3”API npm 包(又名),请升级
- deployment - 如何将 tizen 电视应用程序部署到许多内部电视
- android - 如何仅在 Android Studio 的主要版本中检查更新?
- java - jdk11 scala 2.12.8 兼容性
- c# - 使用 C# 将文本文件数据导入 PostgreSQL 数据库