简单一句话说就是:不要太早下手写。
1.画图纸
编程就像盖房子,盖房子第一步是设计,画出蓝图。
对应到编程就是写设计文档,首先概要设计,画清楚流程图,程序分层架构图,每一层包含的模块。
模块的划分,每个模块功能、对外接口,模块内部子模块的划分,每个子模块功能,以及接口,都要写清楚。
最近从我司的某个模块代码学到了,复杂的业务涉及到流程,数据,事件很多。
此时一个子模块处理事件,利用了自己实现的事件发布订阅中心;
一个子模块处理收到的数据;
一个子模块实现发数据;
一个子模块进行每个步骤超时处理,利用了自己实现的一个timer模块。
一个中心模块负责事件分发及整体流程启动和停止。
简直清晰得不得了,太赞了。
2.搭架子
有了概要设计差不多可以开始编码了(其实还有详细设计)。
编码的第一步是搭架子,写好主要的接口,定义好主要用到timer、任务、队列等,将主流程串起来,切忌陷入细节。
以上面的例子来说。
事件处理模块,先定义出整个业务流程需要处理的事件;定义出事件处理回调函数,回调函数先空在那里,不要急着去实现。
定义一个队列,用来放所有收到的事件。
定义事件发布回调函数,用于当事件产生时事件中心调起该回调通知本模块事件产生了;
定义初始化函数,初始化要做的是调用事件中心模块接口去注册事件,注册事件发布回调函数,初始化函数可以先实现。
收数据模块,向数据收发驱动层注册收到数据的回调,回调先不去实现。
发数据模块,定义好发数据接口。
timer模块,定义需要用到的timer,定义好timer超时回调函数,回调先不实现,然后在timer初始化函数中调用timer模块添加timer。
在中心模块定义一个启动流程接口,去调用各个子模块初始化函数,创建任务,任务里面轮询事件模块是否有新事件到,有的话调用事件分发接口进行事件分发(即从队列中取出事件并调用事件处理的回调函数)。
就这样整个架子搭起来了,我理解有点像盖房子先搭好楼四个角那几根承重的柱子以及每层的横梁和楼板。
3.填空
然后再把刚刚空出来的那些回调以及接口都填上具体实现代码。
然而写的中间还是会发现有些地方没想清楚,没设计好,比如刚刚定义的事件少了,发现还需定一个事件,那就加上;又比如接口少了或是接口参数不合理。这种情况是不可避免的。
昨天领导和我说,好的设计是能够让人照着这个设计写出代码,如果看着文档不知道该咋写说明设计得还是不够好。先记一下。
4.最后说一下
如果仅仅盯着代码其实远远不够,整个系统包含编译部分、厂商SDK、OS适配层、SDK适配层、我司平台层(包括各种公共模块和组件)、应用层。
编译部分,包含编译工具GCC、编译批处理工具make,编译脚本makefile(现在又有了CMake,自动生成Makefile,貌似现在都用这个了)、代码编译框架。
代码编译框架根据用户输入的编译指令选择去找到配置文件,根据配置文件编译应用层哪个产品应用代码,编译平台层哪些公共模块,驱动层去链接哪个厂商的SDK,以及哪个版本的SDK等等。
编译前还会根据配置文件生成一些C头文件,里面是一些配置信息,诸如产品型号、软件版本等等,还有自动生成部分代码、编译后自动生成接口说明文档等功能。
而代码其实是表层的东西,如果不了解背后原理直接看代码就会很痛苦,比如如果不了解MQTT的通信机制,直接去啃代码, 看到写着订阅主题都不知道在干嘛。
编码能力是一方面,另一方面是学习各种技术的原理,能够用起来。
后续一 一拆解学习。
最后推荐一个挺好玩的网站:tree.fm,里面收集了世界各地森林里的声音(一般是鸟叫虫鸣,溪流等等的声音),以及实拍的图片,有时候工作时或者睡前打开听听这种白噪音感觉特别治愈。图片还能保存,界面如下:
祝大家假期愉快!
1.SylixOS,这款嵌入式RTOS值得学习!
2.芯片短缺或将结束?数据来说话。。。
3.代码调着调着就失联了,你碰到过吗?
4.图文并茂详解STM32时钟配置
5.电力物联网与嵌入式系统,关系几何?
6.RT-Thread携手北航出版社共办人工智能师资培训
免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。