c - ANSI C - 创建良好 API 接口(interface)的技巧

标签 c api ansi-c

我正在尝试创建一个易于正确使用且难以错误使用的 API。

假设您有一个函数“bool MyObject_SetLocalDateTime(MyObject *pMyObject, params...)”,它允许客户端以YYYY MM DD HH MM SS 格式设置日期和时间 > 格式:

MyObject *pMyObject = MyObject_Create();
...
MyObject_SetLocalDateTime(pMyObject, params...);
...
MyObject_Destroy(&pMyObject);

该功能的良好界面是什么?如果有任何有关如何使接口(interface)在 ANSI C(而不是 C++)中易于正确使用且难以错误使用的提示,我将不胜感激。

最佳答案

我首先要说的是决定什么是“正确”。严重地。

您希望输入最准确吗?您希望该功能不会失败吗?您想限制可输入的值吗?您可能需要考虑您所创建的内容的要求。

如果调用此函数,数据的格式是什么?它可能只是用户输入的字符串“YYYY MM DD HH MM SS”,那么也许最明智的做法是采用一个字符串并自己解析出这些值。当然,您的函数内部还有很多工作要做。

此外,如果您自己编写该函数,则可以对输入值和测试更加宽松,因为您可能知道预期的内容。如果您正在为一个操作系统创建一个函数,该操作系统将有数十万人使用这些 API,您将需要更明确地了解允许的内容,并在函数内对其进行测试。

根据您的情况最“正确”的内容,有多种方法可以指定您引用的简单函数。

bool MyObject_SetLocalDateTime(pMyObject, int YYYY, unsigned int MM, unsigned int DD, int HH, int MM, int SS);//返回值表示成功或失败。

但是,如果消费者为 MM 传递零怎么办?如果消费者传入 13 怎么办?你使用基数0(通常是C使用的)还是常规的1-12来表示月份(jan-dec)的数字,从人类月份的角度来看,这更有意义,但有点奇怪C 程序员的思维方式是什么?

对于日期和时间之类的内容,C 库对此有定义,这会让您更轻松。另外,由于 C 库已经这样做了,因此对于使用您的函数的其他用户来说,这可能看起来更自然。

您还需要定义“难以错误使用”的含义。再说一遍,我是认真的。也许您想为月份(和日期)创建一个枚举,然后将其传递而不是整数。这将使编译器对 API 进行额外的类型检查,但聪明的 API 使用者可能会转换为另一个值,因此不要认为您可以跳过对有效输入的测试。

在您的函数内,您需要验证输入值,无论它们以何种形式传递,以确保它们有效,检查您是否不允许 2 月有 30 日,并且允许 29 日二月一次,但每四年一次。日期和时间有很多隐藏的复杂性,因此明智的做法是依赖操作系统或运行时库中已开发的例程。

关于c - ANSI C - 创建良好 API 接口(interface)的技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12206064/

相关文章:

jquery - 从 ajax 完成的列表中获取点击的项目

c - 在 C99 中如何在运行时计算可变长度数组的大小?

c - 对c中的指针和数组进行澄清

c - void * 函数指针

node.js - 使用 Node/Express 发送后不断收到 "Can' t set headers

c# - C# 中的 Google 网站站长工具 API

c - 如何在 Mac 上打开并使用 1996 年的旧 ANSI C 代码?

c - C 中的变量声明空间敏感性

c - 注意 c 中字符串的奇怪行为

c - C语言如何让客户端知道服务器已经发送完数据?