c - 如何处理哈希图中缺少的键
问题描述
key
当要求 a 无法返回时,什么可能是正确的错误或返回代码?
void hash_delete(hash_table* table, const char* key)
{
hash_item* item = hash_get(table, key);
if (item == NULL)
; // what error to raise?
else
delete_hash_item_internal(item);
}
我的想法是要么让函数返回 a bool
(1=找到,0=未找到),要么执行exit()
. 您认为处理此问题的正确方法是什么?
解决方案
您有多种可能性,因为您是设计该功能的人。然而,调用exit()
不是一个好的选择,因为它总是强制函数的激进行为。最好让调用者有权决定停止程序、继续、记录某些内容等(正如已经在对 OP 的评论中指出的那样)。所以我会选择在键存在和不存在时返回不同的值。您可以在以下选项中进行选择:
- 返回一个简单的
bool
.true
找到(删除)键时返回。false
找不到密钥时返回。最简单易懂的行为。 - 返回一个
char*
。NULL
找到(删除)键时返回。key
找不到时返回自身。这种方法允许直接对结果采取进一步的行动。这可能很有用,例如,如果密钥是从函数中获取的,并且除非该函数失败,否则不需要存储在变量中。 - 返回一个
hash_item*
。找到键时返回item
变量。NULL
找不到密钥时返回。这是删除函数时最典型的行为之一,它允许直接使用delete
函数的返回值作为get
+delete
避免单独调用。请注意,此方法可能存在一些问题,具体取决于hash_table
实现方式。例如,如果它包含指向hash_item
可能因此包含“有效”NULL
值的指针,并且这些可以解释为删除函数没有找到条目而不是找到包含NULL
.item
如果delete_hash_item_internal()
函数从存储在表中的指针(您将返回)或类似的东西中释放内存,返回也可能有问题。
如果必须选择,我更喜欢最后一个选项(如果可能由于我提到的问题)。如果不可能,为了简单起见,我会使用第一个。但最终由您作为设计师来决定哪个更好,同时还要考虑您需要的其余代码以及您希望如何使用该功能。
推荐阅读
- c++ - MacOS Xcode上的Opencv不能使用imread读取基于C++的图像
- javascript - 解释 javascript 闭包的调试值
- angular - Update ngModel if it's not null angular 5
- angular - 如何在 Angular 5+ 中使用 ngx-file-drop 验证文件?
- autodesk-forge - 如何将自定义菜单添加到 Autodesk Forge Viewer?
- wordpress - Woocommerce 电子邮件主题占位符
- xamarin - Hijri / Gregorian calendar 是否有任何好的 Xamarin 表单控件?
- python - 如何生成长度为 8 且唯一的随机整数
- javascript - 创建嵌套对象 JavaScript 的有效方法
- java - 调用 MenuItem.getActionProvider() 时出现异常