常见 API 设计规范

300 阅读2分钟

这是我参与8月更文挑战的第9天,活动详情查看:8月更文挑战

在实际编码的时候,往往会遇到不同的编码风格和设计规范,下面是常用的设计规范,可以学习一下。

学习常见的 API 设计规范

命名规则

采用小写+下划线命名风格,不使用库名作为接口的前缀名。

数据类型

数据类型名称以 _t 结尾,示例:

struct foo_t {
    int bar;
};

如果是结构体类型,则应该使用 typedef 为该类型定义别名:

typedef struct foo_t foo_t;

不使用 typedef 为数据类型的指针定义别名,例如以下写法是不推荐的。

typedef struct foo* foo_t;

我们推荐将复杂数据结构定义在源文件中,在头文件中只公开由 typedef 定义的别名,操作接口只接受该数据结构的指针,示例:

// exampletypedef struct foo_t foo_t;
​
foo_t *foo_create(int bar);
​
void foo_destroy(foo_t *foo);
​
// example.c#include "example"struct foo_t {
    int bar;
};

函数命名

推荐采用面向对象命名风格,以对象类型名称为前缀,后面接动词或动宾词组,相当于将 object.doSomething() 写成 object_do_something()。 函数命名中所使用的动词必须是常见的单词,例如:

  • get/set
  • add/remove
  • new/free
  • create/destroy
  • init/shutdown
  • open/close
  • start/stop
  • begin/end

示例:

const char *value;
foo_t *foo;
​
foo_create(&foo);
foo_set_property(foo, "key", "value");
foo_get_property(foo, "key", &value);
foo_destroy(foo);

参数命名

无论是函数命名还是参数命名都该保证其含义清晰。

示例:

//wrong
void foo_destroy(foo_t *f);
//correct
void foo_destroy(foo_t *foo);

使用宏定义的常量采用大写+下划线命名风格; 使用宏定义的函数采用小写+下划线命名风格。

实现

注释

对每个接口都编写注释,注释规范使用doxygen格式。

合法性检查

在每个接口实现的开头,都应当进行输入变量的合法性检查。

如果有条件的话,增加异常处理措施可使程序更加可控。