仓库源文

.. Kenneth Lee 版权所有 2019-2020

:Authors: Kenneth Lee :Version: 1.0

接口分层的问题


最近看到一个接口说明,这个接口分两个层次:lower和higher层,我看到它描述lower层 的时候这样说的:lower层的接口不保证互斥,互斥在higher层保证。

这句话事实上是对的。但作为接口文档,这样写是错的。

你看,你分了两层,本来就是允许用户分两层来使用你的接口。比如用户觉得你的higher 层的封装不符合他的要求,他直接从lower来实现他的功能。如果他必须同时使用你的 lower和higher层,那你相当于没有分层,你就一层就可以了。

这种情况下,你描述lower层的时候,根本不应该出现higher层的字眼。因为lower层应该“ 看不见”higher层才对。

第二个问题,“lower层的接口不保证互斥”这句话也不应该说。“保证互斥”是一个人为制造 的问题,“保证互斥”不是我的需求啊,我调你的接口就是为了完成功能,你吃饱没事给我“ 保证互斥”是什么意思?“互斥”是我要求的一部分吗?我要求get_my_data(),你给我data 就好了,你自己有公共数据接口,要互斥使用,那是你的问题,不是我用户的问题好吧?

所以,这个正确的说法是:“lower层任意多个接口不能被多个线程同时调用”,这是这个层 的正确表达,它是一个限制。

正因为这是一个限制,所以我们才常常在lower这种基础层次上保留这样的限制,因为限制 可以来自各个地方,可能到了lower这种层次,限制已经发生了,我不需要在最底层重做这 个限制。比如我还有很多接口,为了使用那些接口,我们不得已引入了一把锁,已经让整 个调用串行了,这时我在lower层内部再加入这个限制,这个性能就不得不降下来了。甚至 如果lower层里面有回调,还有造成死锁一类的问题。所以既然在最低层,我们就需要把高 层逻辑留给高层,而不是在底层越俎代庖。(这算是回答这个文档::doc:线程的本质 ,有人问的,没有锁怎么实现功能的问题了)

所以,事实上的正确,不是接口上的正确。接口定义常常就是架构设计,因为它代表了你 对未来变化的判断。不要把接口写得好像拉家常一样,谨言慎行一点。

补充1:有人认为,“lower层任意多个接口不能被多个线程同时调用”,和“lower层没有互 斥”是同一个意思。因为说一个接口不能被多个线程同时调用,唯一的原因是里面有状态, 所以同时访问是有问题的,所以,“没有互斥”,在我们一般理解的范围内,已经表达这个 意思了。

问题是:“没有互斥”并没有说“多个接口不能被多个线程同时调用”啊,你没有互斥,和我 用多个线程同时调用有什么关系?你互不互斥是你的事情,不是对我用户的要求啊。