+ -
当前位置:首页 → 问答吧 → 关于C语言实现“接口”,有点疑惑

关于C语言实现“接口”,有点疑惑

时间:2010-08-19

来源:互联网

本帖最后由 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语言实现的接口"呢?
迷糊

作者: idolspawn   发布时间: 2010-08-19

我也买了,不过感觉作用不是太大,都是一些规范性的问题。

作者: liexusong   发布时间: 2010-08-19

接口最重要的一点,就是要隐藏实现,按照第一种方式,虽然实现比较复杂,但提供给外面的“接口”是很简单的:

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

或者再加一个工厂接口:

struct Locker * Locker_create( const char * type );

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

作者: drangon   发布时间: 2010-08-19

fuck 所有“规范的做法"

作者: zylthinking   发布时间: 2010-08-19

热门下载

更多