一个程序员问禅师?”什么是好的接口“,
接口的功用和翻译类似(人和系统的界面层,沟通的媒界),信,达,雅也许是一个指导,
信,当然指正确性,可用性,
达,能够符合惯用法,可以被人容易理解和使用,
雅,做到对于系统特色在界面上的升华,能够反映系统特色,让人用得舒服,
对于第三点展开一下,我对于“雅” 接口的看法,
-
高性能是不是雅?
比如说,古早的win32 API是一种面向系统性能的设计,在使用时,它经常要求你构造一个非常细节的数据结构(精细到字节及至位级别),
时至今日,我以为这种作法不再是好的,不,是当年,我就因为 windows API, 视学习编程为畏途,
win32 API 后出现了 Dephi, 第一个被大家誉为能够快速开发,快乐写系统代码的win32 开发框架, 它提供了较高层次,看上去没那么高效的API,
接着有 Java SDK, 一个较好理解和可用的系统级API, 然后是.net SDK, 大家都发现较高层的系统API,没产生什么性能影响,
更不用说,现在直接传json啊,字串啊之类的脚本API,
那性能是否还需要重视?这依据是更接近系统,还是更接近终端用户层面,也即你的用户是谁
-
你的接口为谁而用?
你需要把接口理解成产品功能,想象自己是用户,问以下几个问题,多快能上手API?
一个语法不通的名字,会不会影响用户心情?
文档在哪?例子在哪?
-
只写接口就行了吗?
一个稍有点复杂度的系统,没人能够看接口就会用,看了不一定会用,
用了不一定会对,
对了还可以有更好的用法,
你需要写文档,也需要写好例子,告诉用户推荐的用法那么找文科生,产品,定义接口就好了吧?
并不是,你需要考虑接口的 完备性,正交性,安全性,性能 ( 法老不懂爱,文科同学不懂hello world)
接口,有着理论性的指导 作为理论层面的接口
完备性,
(wikipedia词条,完备性) 在数学及其相关领域中,一个对象具有完备性,即它不需要添加任何其他元素,这个对象也可称为完备的或完全的。更精确地,可以从多个不同的角度来描述这个定义,同时可以引入完备化这个概念。但是在不同的领域中,“完备”也有不同的含义,特别是在某些领域中,“完备化”的过程并不称为“完备化”,另有其他的表述,请参考代数闭域、紧化或哥德尔不完备定理。
换句大白话说,接口不多也不少,它恰好实现了需求,
正交性,
(wikipedia词条,正交) 正交是垂直这一直观概念的推广
定义一个2D坐标,一个点只有一种精确定义(X,Y) 你有没有感觉,实现一个业务,可以用好几种不同的方式?
你有没有感觉,有两个接口完成了类似的事情,存在交集?
安全,
并不容易做到,实际很多API也没有做到,
你任意调用API序列,可能出现UB(undefined behavior),甚至异常,
但还是要尽量达到,至少有良好的报错,
性能,
c++ STL容器有好几种规格,它为啥不像 脚本语言一样,只提供一个 [], 数组,map就足够了,
因为它面向系统开发,它的用户是系统程序员,在不同场景下,性能指标影响他们对特定接口的选择,
比如说,都满足 random access container, 但作为 vector, 和 list ,他们在插入,删除,查找等存在算法上的巨大差异,
这些在接口注释,文档里都标记得很详细