关于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语言实现的接口"呢?
迷糊
看了李先静先生的《系统程序员成长计划》,有一章讲到“接口”,说接口主要是用来隔离变化的。以实现一个通用的锁为例,说明了如何实现接口。下面是书上实现接口的主要流程(以加锁函数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内部怎样修改,都不会影响外部。
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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28