有序数组去重代码优化咨询:寻求Clean Code改进建议
有序数组去重代码的Clean Code优化建议
先明确原代码的核心问题,再给出符合Clean Code规范的优化实现:
原代码关键问题
- 未定义行为:
last_item初始化为未初始化的result[0],会导致程序行为不可预测(可能读取随机值,错误过滤第一个元素)。 - 结果数组处理错误:直接用原数组索引赋值
result[i],会让结果数组留下大量未初始化空位,无法得到真正的去重后数组。 - 返回值不符合规范:
main函数正常结束应返回0,返回1会被视为程序执行失败。 - 命名模糊:
last_item、arr_size等变量表意不够精准,降低代码可读性。 - 数组长度计算可读性差:
*(&arr + 1) - arr依赖指针运算细节,不如sizeof(arr)/sizeof(arr[0])直观。 - 逻辑未模块化:去重逻辑和主流程混在一起,无法在其他场景复用。
优化后的Clean Code实现
#include <stdio.h> // 对有序int数组去重,返回去重后元素的数量 int remove_duplicates(const int arr[], int arr_len, int result[]) { if (arr_len == 0) { return 0; } int unique_count = 1; result[0] = arr[0]; for (int i = 1; i < arr_len; ++i) { // 仅当当前元素与最后一个唯一元素不同时,加入结果数组 if (arr[i] != result[unique_count - 1]) { result[unique_count] = arr[i]; unique_count++; } } return unique_count; } int main() { const int original_arr[] = {1,2,2,2,3,4,4,4,5,6,7,7,7,8,8}; const int original_len = sizeof(original_arr) / sizeof(original_arr[0]); printf("原数组长度:%d\n", original_len); // 结果数组最大长度不会超过原数组 int unique_arr[original_len]; int unique_len = remove_duplicates(original_arr, original_len, unique_arr); printf("去重后数组元素:"); for (int i = 0; i < unique_len; ++i) { printf("%d ", unique_arr[i]); } printf("\n去重后长度:%d\n", unique_len); return 0; }
优化点说明
- 模块化设计:将去重逻辑封装为独立函数,参数明确、返回值清晰,方便复用和单独测试。
- 精准命名:
original_arr、unique_count等变量名直接表达用途,无需额外注释就能理解代码意图。 - 规避未定义行为:初始化结果数组第一个元素,通过
unique_count跟踪有效索引,确保所有操作的内存都是合法初始化的。 - 符合C标准:
main函数返回0表示正常退出,用const修饰只读的原数组,增强代码安全性。 - 可读性提升:用直观的方式计算数组长度,循环逻辑添加简洁注释,降低理解成本。
- 边界处理:增加空数组的判断逻辑,避免极端场景下的错误。
内容的提问来源于stack exchange,提问作者Paroz
相关产品推荐
相关产品推荐

