我目前正在解决的设计问题是迭代某个内存区域,并在每次这样的迭代中从该内存中检索客户感兴趣的一些元数据。我目前看到 2 个解决方案:
一世。
struct queue;
struct queue_element_view{
int id;
char *description;
};
//0 - if ok, -1 - if end of queue reached
int next(struct queue*);
//0 - if ok, -1 - if end of queue reached
int current_element_view(struct queue*, struct queue_element_view *);
所以队列不透明结构可以通过next
函数遍历,因为队列元素是平台相关的,我想保持库跨平台,我提供了一个平台无关struct queue_element_view
的,在所有平台上都是明智的。
退税:
如果客户端编写这样的代码:
struct queue *queue_ptr = //
struct queue_element_view current_out;
current_element_view(queue_ptr, ¤t_out);
//current_out now contains current's element meta data
next(queue_ptr);
//current_out now may contain unspecified data
//since queue's current element changed.
所以调用next
后调用current_element_view
clobbers current_out
。
二、
struct queue;
struct queue_element_view;
struct queue_element_view *allocate_view(void);
int * get_id(struct queue_element_view *);
char * get_description(struct queue_element_view *);
//0 - if ok, -1 - if end of queue reached
int next(struct queue*);
//0 - if ok, -1 - if end of queue reached
int current_element_view(struct queue*, struct queue_element_view *);
在这种情况下,我们已将数据分配struct queue_element_view
并current_element_view
复制到 struct 指向的对象,queue_element_view *
因此 next 不会破坏数据。
缺点:
它涉及一个函数附加调用来简单地检索
int
和char *
字段它使测试公共 api 更加复杂。
所以我有点困惑哪一个更可取/可读?可能还有另一种选择?