大型纪入片《人类代码的特征1》
2025-10-18 12:36:58
发布于:浙江
hi,我又来啦,记得点赞哦,
(我还会在bilibili上更新minecraft)
1. 可读性与可维护性
这是最核心的特征。代码是写给人看的,只是顺便让机器执行。
- 有意义的命名:变量、函数、类名都清晰地表明了其意图。
calculateAverageScore()
而不是calc()
或func1()
std::vector<Student> m_students;
而不是std::vector<Student> v;
- 一致的代码风格:缩进、空格、大括号位置等在整个项目中保持一致。
- 例如,使用
Allman
风格{}
还是K&R
风格{}
。
- 例如,使用
- 适当的注释:
- “为什么”而不是“做什么”:好的注释解释代码背后的意图、算法选择的原因或某些复杂逻辑的背景。
- 文件/类/函数头注释:说明目的、作者、参数、返回值和可能的副作用。
- TODO/FIXME/NOTE:标记待办事项或需要特别注意的地方。
- 避免魔法数字/字符串:使用具名常量或枚举来代替直接出现在代码中的字面量。
const int MAX_BUFFER_SIZE = 1024;
而不是直接使用1024
。enum class Color { Red, Green, Blue };
而不是使用0, 1, 2
。
2. 结构与组织
人类代码是经过设计的,而不是随意堆砌的。
- 模块化与分解:将复杂问题分解为小的、可管理的函数和类。
- 遵循单一职责原则:一个函数或类只做一件事。
- 合理的层次结构:代码被组织在命名空间、头文件(.h/.hpp)和源文件(.cpp)中,以分离接口和实现。
- 适度的抽象:使用类、模板和继承来创建抽象,但不会过度设计。抽象是为了简化问题,而不是炫耀技巧。
- 设计模式的应用:在适当的地方会使用如工厂模式、观察者模式、RAII等经典设计模式来解决特定问题。
3. 资源管理与安全性
C++赋予程序员强大的权力,也意味着对资源管理的重大责任。
- RAII:这是C++的核心 idiom。资源(内存、文件句柄、锁等)的获取在构造函数中完成,释放则在析构函数中完成。这确保了异常安全。
- 使用
std::unique_ptr
,std::shared_ptr
而不是裸new
/delete
。 - 使用
std::vector
或std::string
而不是动态分配的C风格数组。
- 使用
- 异常安全:考虑代码在发生异常时的行为,确保不会泄露资源或破坏数据一致性。通常会提供基本的、强烈的或不抛出的异常安全保证。
- const正确性:广泛使用
const
关键字来标记不应修改的参数、方法和对象,这既是编译时的约束,也是给阅读者的承诺。void print(const std::string& message) const;
4. 对性能与控制的关注
这是C++程序员区别于其他语言程序员的一个关键点。
- 对开销的认知:了解拷贝、函数调用、虚函数等操作的成本,并在关键路径上主动优化。
- 引用与移动语义:在C++11及以后,会熟练使用右值引用和移动语义来避免不必要的深拷贝。
- 使用
const T&
传递只读参数,使用T&&
实现移动构造/赋值。
- 使用
- 标准库的高效使用:熟悉STL容器和算法的复杂度,并能选择最适合当前场景的组件。
5. 防御性编程与错误处理
人类知道代码会出错,用户会误用。
- 断言:使用
assert
或静态断言static_assert
来捕获在调试阶段不应发生的逻辑错误。 - 输入验证:不信任外部输入,对函数参数和用户数据进行校验。
- 明确的错误处理:使用返回值、异常或
std::optional
/std::expected
(C++23) 等方式来明确地报告和处理错误,而不是简单地忽略。
6. 演进与团队协作的痕迹
代码是活的,会随着需求变化和团队成员的更替而演变。
- 版本控制信息:注释中可能包含与版本控制系统(如Git)相关的提交信息或Issue编号。
- 被注释掉的旧代码:有时为了对比或临时测试,会保留一些被注释的代码,并附上注释说明原因。
- “臭味”与妥协:代码中可能存在一些不那么完美的“临时方案”或已知的“技术债”,并伴有注释说明。这反映了项目进度和现实约束的平衡。
示例对比
机器生成/初学者代码:
int f(int a[], int n) {
int s = 0;
for (int i = 0; i < n; i++) s += a[i];
return s;
}
人类编写的C++代码:
// Calculates the sum of all elements in the provided range.
// @param values A non-null span of integers to sum.
// @return The total sum of the elements.
// @throws std::invalid_argument if the span is empty (depending on policy).
int calculateSum(std::span<const int> values) {
if (values.empty()) {
// Policy decision: We choose to return 0 for empty range.
// Alternatively, we could throw an exception.
return 0;
}
return std::accumulate(values.begin(), values.end(), 0);
}
总结来说,人类C++代码的特征是:意图清晰、结构严谨、安全可靠、高效可控,并且充满了为其他人类读者考虑的“人文关怀”。
全部评论 1
4天前 来自 浙江
0?
4天前 来自 上海
0
有帮助,赞一个