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