引言
很多初学者写完代码,一运行结果正确就万事大吉。
但正确只是及格线,优雅才是优秀程序员的追求。
本文面对初学者。
今天,我们通过一个成绩统计程序,看看如何让你的代码焕然一新。
第0版:原始混沌期 (Just Works!)

运行结果:

问题诊断:
命名随意:a, s, v, c 像密码,不看上下文根本不懂。
魔法数字:a[100] 里的 100 是哪来的?最多支持100个学生?为什么?
功能糅杂:所有逻辑都挤在 main() 里,输入、计算、输出不分家。
健壮性为零:如果输入 n > 100 怎么办?如果 n <= 0 怎么办?
优雅原则初显:代码首先是写给人看的,其次才是给机器执行的。
第1版:清晰命名与消除魔法数字 (变得可读)

运行结果:

改进点:
见名知意:scores, student_count, average_score。
宏定义:MAX_STUDENTS 说明了容量限制和原因。
基础验证:对关键输入 student_count 做了合法性检查。
格式统一:空格、缩进让代码结构一目了然。
优雅原则:清晰的命名是最好的注释。防御式编程是可靠性的基石。
第2版:功能分解 (变得模块化)



运行结果:

改进点:
单一职责:每个函数功能明确,如乐高积木,可独立测试和理解。
接口清晰:函数名和参数清晰地定义了它要什么、做什么、返回什么。
动态内存:用 malloc 替代固定数组,程序能力不再受 MAX_STUDENTS 限制。
释放资源:有 malloc 就有 free,养成好习惯。
优雅原则:一个函数只做一件事,并且做好。良好的结构是长期维护的生命线。
最终版:引入结构体与增强表达力 (变得富有语义)


最终的精髓:
提升抽象层次:从“操作一堆数组和变量”上升到“管理一个Gradebook(成绩单)对象”。代码在讲述业务故事。
数据与操作绑定:相关数据和函数通过结构体自然关联,这是面向对象思想的朴素体现,非常符合直觉。
生命周期明确:create 和 destroy 配对,资源管理清晰。
优雅的终极体现:代码准确反映了现实世界的逻辑和概念,让阅读代码就像阅读清晰的散文。
总结(checklist):给初学者的优雅代码
当你写完代码后,可以问自己这几个问题:
1、命名:变量/函数名是否清晰,能直接表明其用途? (sum vs s)
2、函数:每个函数是否只做一件明确的事情?(一个函数超过50行就要警惕)
3、注释:注释是否解释了“为什么这么做”(意图),而不是重复“代码在做什么”?(代码展示How,注释解释Why)
4、格式化:缩进、空格是否一致?良好的格式是礼貌。
5、防御性:对用户输入、文件打开、内存分配等重要操作,是否检查了可能失败的情况?
6、魔法数字:程序里是否有含义不明的数字?用#define或const变量给它起个名字。
7、复杂度:如果某段逻辑特别绕,能不能画个图?能不能拆成更小的函数?
也许有些同学会有疑问:难道优雅代码就是把代码写得长长的吗?
不是的,因为从第0版到第3版,我们是在为自己以后能创建并实施一个大型项目做准备。
追求优雅不是炫技,而是一种专业态度和对同行(包括未来的自己)的尊重。
从今天起,试着让每一行代码都清晰、结实一点,你会在不知不觉中成长为一名优秀的开发者。