本帖最后由 suxilong 于 2019-3-2 11:27 编辑
最近在优化以前一个项目的代码。这个项目中有很多模块,目前每个模块都错综复杂。
优化前定了一套规范,大致如下:
1. 模块内部尽量实现分层,底层负责从外部拿数据,中层负责处理业务逻辑,高层负责封接口给外部用
2. 模块尽量与外部隔离,只通过高层输出,底层输入
理想标准模型如下:
但实际中却遇到了非常多非常多的问题和细节,让我非常纠结~~~~希望各位大神可以指点指点!
大概目前遇到 的有以下几大类:
1. 变量外输 接口封装职责归属 问题
纠结描述: 比如模块A 变量a 如果需要被另外模块 B 调用,那么接口封装的归属A 还是归属B ?还是两边都要封?
设想处理: ==》由模块A 封装 uint8_t get_a(void);
==》如果模块B 的mid 层需要呢? 那难道 mid 层也 include 模块A 的 app.h? 这样违背一开始定的规范?
==》如果模块 B 的drv include 调用模块A 的app.h ,然后 调用 uint8_t get_a(void); 再封一次,这样一变量要封2次接口是不是太累赘了? 如果模块B 的app.h 需要呢? 又得由mid 层再 封多一次?
==》 如果这个变量a 刚好是 模块A 的mid 层 所有, 那么是不是mid 层封给 app层, app 层 在封给外部?
2. 模块内部数据的下传
纠结描述: 一开始规范定义 数据或接口最好是由下往上,但如果app 层有一个数据 uint8_t a需要被 自己的mid 层或者 drv 层调用呢?
设想处理: ==》由mid 层 封装 一个 注册的函数 例如void reg_from_app_a(uint8_t a);然后在定义个mid层的全局变量,来获取app 层的数据
===》 但是这样,到时drv 层也要, 会产生两个 不必要 全局变量。本来RAM 就不多!
===》还是不管三七二十一, mid层 include app.h drv 层include app.h , 模块内部乱成一团麻~~~~这样又有点破罐子破摔~~~
3. 头文件的包含问题
有一个头文件 typedef.h ,里面搞了一堆 typedef unsigned char uint8_t 之类的东西。
但是偏偏 typedef unsigned int uint32_t ; 和 typedef unsigned char bool ; 这两个 导致了conflict error~~~~~
这样等于如果有函数 是bool 和uint8_t之类 返回值的,又需要在xx.h 声明, 那么xx.h 除了要包含 typedef.h 还需要 包含 stdboo.h 。。。
问题: 一般这些typedef 如何做到 不冲突 又能包含全部呢?
这些还只是**长征第一步遇到的问题~~~到了后面还不知道有多少这些问题!!!!
(这个帖子会一直更新~~~)
|