其实刚参加工作的时候,老大就告诉我们,做程序要模块化,然后一直以来对这个概念比较模糊,因为从硬件入手进入编程领域的同学,基本和我差不多,都是一点一点自己在摸索,一点一点进步。直到2010年,当时要学一点OS,在Linux里面才学到那么一点点意思!昨天浪里白条问我一个问题,所以我就想写写自己的心得出来给大家参考!
我的理解,模块化的主要意义在于模块分离。有一种情况是移植,比如说我做了一个模块,可能要在不同的程序中应用,但是在此模块中可能会调用别的模块的变量、函数、参数等等,这样的话用的时候就需要对模块进行工作量大小不一的修改。那么有什么好办法可以不用修改模块呢?在这里,我用指针,用指针的好处是可以将模块与其它模块完全脱离,像上次老白说的,说GSM模块中有调用UART模块中的函数。这种情况就是在GSM模块中定义一个函数指针,然后在初始化的时候将UART模块中的函数赋值给它,这就造成一个假像,此函数属于GSM模块了,用的时候调用的是GSM模块本身的变量。这样的好处是下次GSM模块需要调用SPI模块同样功能的函数,那么我只要在初始化的时候将SPI模块的该函数赋值给GSM模块的函数指针就可以了。为了防止该指针在没有被赋值的情况下被调用,我们在调用之前需要先判断一下该指针是否为空,这样就不会造成野指针的出现!以上是一个以函数为代表说明一下分离,其它的都差不多,比如变量什么的,都可以用指针在本模块中做一个虚拟值,就像我们做硬件模块,以前都是直接把线焊到一起的,分离的时候很麻烦,现在我用了一个插座,呵呵,那分离就简单多了,指针就是我们的插座,只要在初始化的时候把各个插座对接上,那么就可以应用了!
另外还有一种情况,在同一个程序中重复调用。我还用刚才GSM模块说明,比如现在我需要两个GSM模块功能,但是这两个可能在同一段时间内都要被调用,那么可能我在任务1中调用GSM模块的时候任务2也需要调用,所以这时候GSM模块中的一些公用参数就会产生冲突。这时候又该怎么办呢?我的做法是用结构体,我将所有公共参数都包含到一个结构体里面去,然后在该模块初始化的时候申请一块结构体大小的内存,作为当前模块的共用参数的保存。只要记住起始指针就可以了。这样我就不怕他重复调用了,程序还是原来的程序,只是两个任务调用的时候所操作的数据区完全不同了,也不会影响到别的调用!
其实这大概就是面向对像的原理!像我前几天发的一个代码生成的帖子中的那个小工具,就是基于这个原理做出来的。
例子没有,欢迎讨论!
最后祝大家工作顺利!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>