设计一个好的接口

一个程序员问禅师?”什么是好的接口“,

image

接口的功用和翻译类似(人和系统的界面层,沟通的媒界),信,达,雅也许是一个指导,

信,当然指正确性,可用性,

达,能够符合惯用法,可以被人容易理解和使用,

雅,做到对于系统特色在界面上的升华,能够反映系统特色,让人用得舒服,

对于第三点展开一下,我对于“雅” 接口的看法,

  1. 高性能是不是雅?

    比如说,古早的win32 API是一种面向系统性能的设计,在使用时,它经常要求你构造一个非常细节的数据结构(精细到字节及至位级别),

    时至今日,我以为这种作法不再是好的,不,是当年,我就因为 windows API, 视学习编程为畏途,

    win32 API 后出现了 Dephi, 第一个被大家誉为能够快速开发,快乐写系统代码的win32 开发框架, 它提供了较高层次,看上去没那么高效的API,

    接着有 Java SDK, 一个较好理解和可用的系统级API, 然后是.net SDK, 大家都发现较高层的系统API,没产生什么性能影响,

    更不用说,现在直接传json啊,字串啊之类的脚本API,

    那性能是否还需要重视?这依据是更接近系统,还是更接近终端用户层面,也即你的用户是谁

  2. 你的接口为谁而用?
    你需要把接口理解成产品功能,想象自己是用户,问以下几个问题,

    多快能上手API?

    一个语法不通的名字,会不会影响用户心情?

    文档在哪?例子在哪?

  3. 只写接口就行了吗?
    一个稍有点复杂度的系统,没人能够看接口就会用,

    看了不一定会用,
    用了不一定会对,
    对了还可以有更好的用法,
    你需要写文档,也需要写好例子,告诉用户推荐的用法

    那么找文科生,产品,定义接口就好了吧?
    并不是,你需要考虑接口的 完备性,正交性,安全性,性能 ( 法老不懂爱,文科同学不懂hello world)
    接口,有着理论性的指导

  4. 作为理论层面的接口
    完备性
    (wikipedia词条,完备性) 在数学及其相关领域中,一个对象具有完备性,即它不需要添加任何其他元素,这个对象也可称为完备的完全的。更精确地,可以从多个不同的角度来描述这个定义,同时可以引入完备化这个概念。但是在不同的领域中,“完备”也有不同的含义,特别是在某些领域中,“完备化”的过程并不称为“完备化”,另有其他的表述,请参考代数闭域、紧化或哥德尔不完备定理。
    换句大白话说,接口不多也不少,它恰好实现了需求,
    正交性
    (wikipedia词条,正交) 正交是垂直这一直观概念的推广
    定义一个2D坐标,一个点只有一种精确定义(X,Y) 你有没有感觉,实现一个业务,可以用好几种不同的方式?
    你有没有感觉,有两个接口完成了类似的事情,存在交集?
    安全
    并不容易做到,实际很多API也没有做到,
    你任意调用API序列,可能出现UB(undefined behavior),甚至异常,
    但还是要尽量达到,至少有良好的报错,
    性能
    c++ STL容器有好几种规格,它为啥不像 脚本语言一样,只提供一个 [], 数组,map就足够了,
    因为它面向系统开发,它的用户是系统程序员,在不同场景下,性能指标影响他们对特定接口的选择,
    比如说,都满足 random access container, 但作为 vector, 和 list ,他们在插入,删除,查找等存在算法上的巨大差异,
    这些在接口注释文档里都标记得很详细

你可能感兴趣的:(设计一个好的接口)