打印

一些无关紧要的编程经验

[复制链接]
600|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
红蛋大叔|  楼主 | 2017-10-18 21:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
构建接口(一)

我们做产品时有时候需要两个公司甚至多个公司合作。为了将不同公司之间的程序隔离,通常编程时针对接口而非细节编程,所以接口定义就很重要了。接口定义必须满足两点,第一点两方中一方改动都尽量不能让另一方改动;第二点是两方之间不需要知道对方的功能是如何实现的,只需要知道这个接口是干什么用的。
一个例子
当我要发送无线数据时需要调用第三方提供的SDK中的数据发送接口完成组帧与加密以及数据发送任务。由于SDK并不知道应用层的无线发送到底是怎样操作的,所以这个时候就需要SDK提供一个回调函数隔离我的数据发送函数,让我去完成这个无线数据发送函数,SDK则在必要的时候通过回调函数来调用我的数据发送函数将数据发送出去。
SDK提供的接口,函数声明在sdk_dlink.h中
#ifndef _SDK_DLINK_
#define _SDK_DLINK_
typedef struct dlink_driver_callback_s
{
    void  (*drv_start_xmit)(unsigned char* data,unsigned long datalen);
}dlink_driver_callback_s;
void  dlink_drv_register_driver(dlink_driver_callback_s*driver);  //初始化回调函数

void dlink_trans_tx_frame(unsigned char*src_data, unsigned long datalen);//加密并发送无线数据
#endif

应用层文件app.c
#include"sdk_dlink.h"

void app_data_send(unsigned char *psrc, unsigned len )
{
   //psrc指向被SDK加密以及组帧后的数据,len是数据长度
   //由于与芯片有关,这部分就是我要完成的数据发送任务
}
void app_data_send_callback_init(void )
{
dlink_driver_callback_s  data_send_callback;
data_send_callback.drv_start_xmit  = app_data_send;
}
unsigned char test[20];
main()
{
app_data_send_callback_init();
while(1)
{
    if(条件满足)
{
    dlink_trans_tx_frame(test,10);    //加密数据并调用app_data_send函数完成数据发送
}
}
}
利用回调函数隔离变化是一种常见的手段,除了应用在调用第三方SDK的场合外还可以用于在自己的代码中抽象出共同功能而把变化隔离出去,下次再说吧。


相关帖子

沙发
红蛋大叔|  楼主 | 2017-10-22 09:38 | 只看该作者

使用特权

评论回复
板凳
gujiamao12345| | 2017-10-22 11:39 | 只看该作者
dll一般都这样搞,外部注册一个函数进去,当然内部也会有个weak函数

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

69

帖子

3

粉丝