如果有人想构建一个用于处理I / O(处理特定文件格式)的C库,他们几乎必须提供以下内容:
/* usual opaque struct setup */
struct my_context;
typedef struct my_context my_context_t;
/* Open context for reading from user specified callbacks */
my_context_t* my_open_callback(void* userdata,
size_t(*read_cb)(void* data, size_t size, size_t count, void* userdata),
int(*close_cb)(void* userdata),
void(*error_cb)(const char* error_msg)
);
然后提供一些常见的:
/* Open directly from file */
my_context_t* my_open_file(const char * filename);
/* Open from an existing memory block */
my_context_t* my_open_memory(const char* buf, size_t len);
据了解,可能存在其他问题,但是这个问题是否被认为可以减少设计中的不一致性,不安全的做法和效率低下,还是有其他一些被认为是最佳做法?这个惯例/最佳实践有名称吗?
答案 0 :(得分:0)
这些是界面设计问题。良好的界面提供了有用的抽象并隐藏了实现细节。在您的示例中,my_context_t
忽略了您的用户群的一些实现细节,前提是您没有在公共标头中完全定义类型。这使您可以自由地对实现进行实质性更改,而无需强制整个用户群重写代码。这是一个非常好的做法,只要你的其余抽象适合问题空间。有时您只需承诺在接口级别公开其他详细信息。