免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2465 | 回复: 5
打印 上一主题 下一主题

关于C语言实现“接口”,有点疑惑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-19 00:22 |只看该作者 |倒序浏览
本帖最后由 idolspawn 于 2010-08-19 00:24 编辑

看了李先静先生的《系统程序员成长计划》,有一章讲到“接口”,说接口主要是用来隔离变化的。以实现一个通用的锁为例,说明了如何实现接口。下面是书上实现接口的主要流程(以加锁函数lock为例):
1.  定义一个Locker
  struct Locker{
    LockFunc lock;
    char priv[0];
  };
2. 实现Locker_lock()函数
Locker_lock(Locker *thiz)
{
  thiz->lock;
}
//到这里,接口算是已经实现好了,接下来是对接口的使用了

3. 接口的使用者创建一个Locker(名叫xxx),然后对这个Locker进行赋值:
xxx->lock = locker_pthread_lock;

4. 接口的使用者自己实现locker_pthread_lock的内部细节
locker_pthread_lock(Locker *thiz)
{
  pthread_mutex_lock(thiz->priv);        //priv其实是个&pthread_mutex
}

5. 之后接口的使用者就可以使用Locker_lock()函数来进行加锁了:
Locker_lock(xxx);


------------------------------
不过我老是觉得以上过程有些复杂,照说来这样实现不行么——
1. struct Locker{
    LockFunc lock;
    char priv[0];
};

2. 接口的使用者创建一个Locker(名叫xxx), 然后进行赋值:
xxx->lock = pthread_mutex_init;         //pthread库函数,一步到位

3. 接口的使用者这样调用:xxx->lock(xxx->priv);

这样我觉得更简洁啊,而且也“隔离了变化”——任你是pthread还是其他什么锁,调用者只知道“我调用的是一个Locker接口的一个lock成员,操作的是它的私有数据”。


------------------------------
感觉上,书中的Locker对象是被操作的,是个客体,类似于beat(a)酱紫;而且整个过程多绕了两圈...
而我下边写的这种实现,Locker结构近似于是个主体,类似于a.beat,但是我不知道以面向对象的观点来看这种做法对不对...
那么究竟应该以什么样的思维来考虑这种"C语言实现的接口"呢?
迷糊

论坛徽章:
0
2 [报告]
发表于 2010-08-19 00:34 |只看该作者
我也买了,不过感觉作用不是太大,都是一些规范性的问题。

论坛徽章:
0
3 [报告]
发表于 2010-08-19 08:34 |只看该作者
接口最重要的一点,就是要隐藏实现,按照第一种方式,虽然实现比较复杂,但提供给外面的“接口”是很简单的:

struct Locker;
int Locker_lock( struct Locker * lock );

或者再加一个工厂接口:

struct Locker * Locker_create( const char * type );

其他细节都可以隐藏起来,Locker内部怎样修改,都不会影响外部。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
4 [报告]
发表于 2010-08-19 10:21 |只看该作者
fuck 所有“规范的做法"

论坛徽章:
2
CU十二周年纪念徽章
日期:2013-10-24 15:41:34处女座
日期:2013-12-27 22:22:41
5 [报告]
发表于 2010-08-19 11:33 |只看该作者
OO对接口的应用更为原生,了解一门OO语言试试。。。。。。。

另:我发现国产的关于数据结构与算法的书几乎都不提ADT,不知何故。

论坛徽章:
0
6 [报告]
发表于 2010-08-19 15:44 |只看该作者
国产书还达不到一定的水平
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP