“布局清晰、控制逻辑严谨”,才是 “好代码” 的标配。但过程中也有不少和作者观点 “碰撞” 的地方,反而让思考更深入。
先说说 “数据声明的布局”。作者提了三个核心建议:每行只声明一个变量、变量声明贴近首次使用位置、合理组织声明顺序。后两点我很快就认同了,比如 “变量贴近使用位置”,之前我习惯把所有变量放开头,结果写着写着就忘了某个变量的用途,后来改成 “用之前才声明”,比如在循环前声明循环变量,调试时一眼就能找到,效率高了很多。但对 “每行只声明一个变量”,我起初有点不理解 —— 比如声明三个 int 类型的计数器(int a=0, b=0, c=0),放一行不是更省版面吗?后来翻到作者补充的说明:“在大型项目中,每行一个变量,方便添加注释、修改赋值,也能避免漏写逗号导致的语法错误”。我试了下:在一个多人协作的小项目里,把变量声明拆成每行一个,还加上注释(//a:用户数量计数器 //b:订单数量计数器),后来队友说 “看你这段代码特别清楚,不用反复问你变量含义”,这才明白作者的建议是从 “工程协作” 角度出发的,不是单纯 “吹毛求疵”。
再聊聊 “控制逻辑” 里的细节。比如作者强调 “在 C 家族语言中,把常量放比较左端”(如 if (5 == num) 而非 if (num == 5)),老师上课提过,但我总觉得 “麻烦” 没照做。直到有次写代码时,把 “==” 误写成 “=”(if (num = 5)),编译器没报错,程序运行时逻辑全错,查了半小时才发现问题。后来特意试了 “常量放左边”:if (5 = num),编译器立刻提示 “赋值给常量”,瞬间定位错误。这才明白,作者说的 “细节里藏着稳定性”,真不是空话 —— 很多 bug 不是因为 “技术不行”,而是没养成这些 “防错习惯”。
还有个小争议点:“空语句和空循环” 的处理。作者建议 “为空语句创建 DoNothing () 预处理宏或内联函数”,比如把 “for (;i<10;i++);” 改成 “for (;i<10;i++) DoNothing ();”,理由是 “单独的分号容易被当成‘遗漏代码’,尤其代码量大时,很可能看花眼”。我起初觉得 “没必要,一个分号我能看清”,但后来参与一个有 300 行代码的项目,调试时发现某个循环没执行 —— 查了半天,才发现是把 “for (;i<10;i++) { // 逻辑代码 }” 写成了 “for (;i<10;i++); { // 逻辑代码 }”,多了个分号导致循环空转。这时候才理解作者的建议:工程化的代码,要 “让别人能看懂,也让自己少踩坑”,一个 DoNothing () 虽然多写几个字,却能避免 “低级失误”。
最后,作者关于 “布局风格统一” 的观点,彻底打消了我的纠结。之前我在 “括号写法” 上总摇摆:一会儿用 “for (…) { }”(紧凑式),一会儿用 “for (…) 换行写 { }”(展开式)。作者说:“高手会有自己的风格,但底线是‘前后一致’—— 整个项目用同一种风格,比‘纠结哪种风格更好’重要”。后来我和队友约定:所有循环和判断都用 “展开式” 括号,比如:for (int i = 0; i < 10; i++){// 逻辑代码}