<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Code Complete on 方糖猫Blog</title>
    <link>https://ftmao.com/blog/tags/code-complete/</link>
    <description>AI 视频、AI Agent 与工程实践笔记</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Sun, 15 Mar 2020 10:00:00 +0800</lastBuildDate><atom:link href="https://ftmao.com/blog/tags/code-complete/index.xml" rel="self" type="application/rss+xml" /><item>
      <title>《代码大全》学习总结：写给新人的实用编程知识与技巧</title>
      <link>https://ftmao.com/blog/bookstore/code-complete-learning-notes/</link>
      <pubDate>Sun, 15 Mar 2020 10:00:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/bookstore/code-complete-learning-notes/</guid>
      <description>&lt;h1 id=&#34;代码大全学习总结写给新人的实用编程知识与技巧&#34;&gt;《代码大全》学习总结：写给新人的实用编程知识与技巧&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;参考书籍：Steve McConnell《代码大全（第 2 版）》&lt;br&gt;
目标读者：刚入行 1～3 年，想把代码写得更好、更稳、更容易维护的程序员。&lt;br&gt;
阅读目标：不追求背下所有规则，而是建立“好代码长什么样”的直觉。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;《代码大全》是一本很厚的书（中文版 900 多页），但它并不是一本讲某种语言语法的技术书，而是一本讲“&lt;strong&gt;怎样把程序写好&lt;/strong&gt;”的书。它覆盖的范围非常广：从需求、设计、构建，到命名、函数、调试、测试、代码布局、性能优化，几乎囊括了程序员日常工作的方方面面。&lt;/p&gt;
&lt;p&gt;这篇文章不会复述全书内容，而是挑出对新人最有用的部分，用通俗易懂的语言、图表和实例帮你建立主干框架。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0-写在前面为什么这本书值得读&#34;&gt;0. 写在前面：为什么这本书值得读&lt;/h2&gt;
&lt;p&gt;很多新人在学完一门语言后，会有一种错觉：&lt;strong&gt;“我会写代码了”&lt;/strong&gt;。但真正进入项目后，才会发现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;需求改了三版，代码已经改不动了；&lt;/li&gt;
&lt;li&gt;自己写的函数，两周后就看不懂了；&lt;/li&gt;
&lt;li&gt;一个 bug 改了三天，越改越乱；&lt;/li&gt;
&lt;li&gt;团队协作时，别人看不懂你的代码，你也看不懂别人的。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些问题往往不是“技术不够”，而是&lt;strong&gt;代码构建的基本功不扎实&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;《代码大全》想告诉我们的核心道理是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;写代码不是艺术，而是一门工程手艺。好代码是可以通过学习、练习和检查清单逐步打磨出来的。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下面我会按照“软件构建的全流程”来组织内容，让你知道每个阶段该注意什么。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-软件构建写代码只是其中一环&#34;&gt;1. 软件构建：写代码只是其中一环&lt;/h2&gt;
&lt;p&gt;很多新人以为程序员的工作就是“写代码”。其实，&lt;strong&gt;写代码只是“软件构建（Construction）”的一部分&lt;/strong&gt;，而构建又是整个软件开发生命周期的一部分。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[问题定义] --&amp;gt; B[需求分析]
    B --&amp;gt; C[架构设计]
    C --&amp;gt; D[详细设计]
    D --&amp;gt; E[编码与构建]
    E --&amp;gt; F[调试与测试]
    F --&amp;gt; G[集成与部署]
    G --&amp;gt; H[维护与重构]
    style E fill:#e1f5e1&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;11-为什么前期准备很重要&#34;&gt;1.1 为什么前期准备很重要&lt;/h3&gt;
&lt;p&gt;《代码大全》反复强调：&lt;strong&gt;前期准备能帮你省下后期大量的返工时间&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;问题定义不清楚&lt;/strong&gt;：你可能解决了一个错误的问题；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;需求没对齐&lt;/strong&gt;：写到一半发现方向错了；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;架构没想好&lt;/strong&gt;：后期改结构成本极高；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设计没做&lt;/strong&gt;：代码边写边改，容易变成“面条代码”。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;新人常见误区&lt;/strong&gt;：拿到需求立刻敲键盘。正确的做法是先用 10% 的时间想清楚“我要做什么、怎么做、边界在哪里”。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;12-构建阶段的核心产出&#34;&gt;1.2 构建阶段的核心产出&lt;/h3&gt;
&lt;p&gt;构建阶段的主要产出是&lt;strong&gt;高质量的源代码&lt;/strong&gt;。它包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;准确实现设计；&lt;/li&gt;
&lt;li&gt;写出可读的函数和类；&lt;/li&gt;
&lt;li&gt;处理异常和边界情况；&lt;/li&gt;
&lt;li&gt;保持代码风格一致；&lt;/li&gt;
&lt;li&gt;为测试和调试留下空间。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-命名代码可读性的第一道门槛&#34;&gt;2. 命名：代码可读性的第一道门槛&lt;/h2&gt;
&lt;p&gt;命名是编程中最频繁、也最容易被低估的动作。好名字能让代码“自解释”，坏名字会让阅读者每隔几秒就要停下来猜意思。&lt;/p&gt;
&lt;h3 id=&#34;21-好名字的标准&#34;&gt;2.1 好名字的标准&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;标准&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;说明&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;反例&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;正例&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;描述意图&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;名字要说明它是做什么的&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;d&lt;/code&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;elapsedTimeInDays&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;避免歧义&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;不要让人猜测含义&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;data&lt;/code&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;userProfile&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;保持一致&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;同类概念用同类词汇&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;getUserInfo&lt;/code&gt; / &lt;code&gt;fetchOrderDetail&lt;/code&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;getUser&lt;/code&gt; / &lt;code&gt;getOrder&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;避免缩写&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;除非团队公认&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;cnt&lt;/code&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;count&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;区分状态&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;布尔值用 is/has/should&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;flag&lt;/code&gt;&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;isValid&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;22-命名的思考流程&#34;&gt;2.2 命名的思考流程&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    A[这个变量/函数/类代表什么] --&amp;gt; B[它的核心职责是什么]
    B --&amp;gt; C[用 2～4 个词能说明白吗]
    C --&amp;gt;|能| D[直接使用描述性名称]
    C --&amp;gt;|不能| E[是否职责过多需要拆分]
    D --&amp;gt; F[检查是否有同义词/缩写混淆]
    E --&amp;gt; G[拆分为多个更小的单元]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;23-一个命名改写的例子&#34;&gt;2.3 一个命名改写的例子&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 坏例子&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;calc&lt;/span&gt;(a, b):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; a &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; b
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 好例子&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;calculate_rectangle_area&lt;/span&gt;(width, height):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; width &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; height&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;p&gt;第二个版本不需要注释，看一眼就知道函数在做什么。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-函数程序的基本构建块&#34;&gt;3. 函数：程序的基本构建块&lt;/h2&gt;
&lt;p&gt;函数是代码复用和逻辑组织的基本单位。写好函数，代码质量会提升一大截。&lt;/p&gt;
&lt;h3 id=&#34;31-好函数的几个原则&#34;&gt;3.1 好函数的几个原则&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;单一职责&lt;/strong&gt;：一个函数只做一件事。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;短小&lt;/strong&gt;：尽量控制在 20～50 行以内，过长的函数往往职责过多。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;参数要少&lt;/strong&gt;：0～3 个参数最好，超过 3 个考虑封装成对象。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;避免副作用&lt;/strong&gt;：函数名是 &lt;code&gt;getUser&lt;/code&gt;，就不要顺手修改了全局状态。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;返回结果要清晰&lt;/strong&gt;：要么返回结果，要么抛出异常，不要混在一起。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;32-函数设计的决策流程&#34;&gt;3.2 函数设计的决策流程&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    A[我要完成一个任务] --&amp;gt; B[这个任务可以拆成几步]
    B --&amp;gt; C[每一步写成一个函数]
    C --&amp;gt; D[函数是否只做一个事]
    D --&amp;gt;|否| E[继续拆分]
    D --&amp;gt;|是| F[参数是否超过 3 个]
    F --&amp;gt;|是| G[封装成对象或配置类]
    F --&amp;gt;|否| H[命名是否清楚表达意图]
    H --&amp;gt;|否| I[重新命名]
    H --&amp;gt;|是| J[完成]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;33-踩坑实例一个函数承担了太多&#34;&gt;3.3 踩坑实例：一个函数承担了太多&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 坏例子：一个函数做了四件事&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;process_order&lt;/span&gt;(order):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 1. 校验库存&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; check_inventory(order):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 2. 计算价格&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    price &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; order&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;quantity &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; order&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;unit_price
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; order&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;vip:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        price &lt;span style=&#34;color:#f92672&#34;&gt;*=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0.9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 3. 扣款&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    charge_result &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; payment_gateway&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;charge(order&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;user_id, price)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; charge_result:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 4. 发货&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    shipping&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;create_shipment(order)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;p&gt;这样的函数很难测试、很难复用、也很难改。更好的做法是拆分成多个职责单一的函数：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 好例子：每个函数只做一件事&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;validate_order&lt;/span&gt;(order):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; check_inventory(order)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;calculate_order_price&lt;/span&gt;(order):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    price &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; order&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;quantity &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; order&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;unit_price
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; apply_vip_discount(price, order&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;vip)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;charge_order&lt;/span&gt;(order, price):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; payment_gateway&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;charge(order&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;user_id, price)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ship_order&lt;/span&gt;(order):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; shipping&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;create_shipment(order)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;process_order&lt;/span&gt;(order):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; validate_order(order):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    price &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; calculate_order_price(order)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; charge_order(order, price):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; ship_order(order)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;感悟&lt;/strong&gt;：函数拆分不是“为了短而短”，而是让每一层逻辑都清晰、可测试、可替换。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;4-防御式编程代码要对外界保持怀疑&#34;&gt;4. 防御式编程：代码要对外界保持怀疑&lt;/h2&gt;
&lt;p&gt;程序运行时，你永远不知道输入会是什么样子：用户可能乱填数据，接口可能返回异常，文件可能不存在，网络可能中断。&lt;strong&gt;防御式编程就是： assume nothing，对输入和状态保持怀疑&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;41-防御式编程的核心做法&#34;&gt;4.1 防御式编程的核心做法&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[接收输入] --&amp;gt; B[验证参数合法性]
    B --&amp;gt; C[处理异常情况]
    C --&amp;gt; D[使用断言约束内部状态]
    D --&amp;gt; E[返回明确结果或报错]
    E --&amp;gt; F[记录关键日志]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;42-具体技巧&#34;&gt;4.2 具体技巧&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;技巧&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;说明&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;例子&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;参数校验&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;不信任外部输入&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;检查 null、空字符串、越界值&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;异常处理&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;错误路径也要处理&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;文件不存在时给出友好提示&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;断言&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;对内部不变量做保护&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;assert index &amp;gt;= 0&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;默认值&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;为可选值提供安全兜底&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;timeout = timeout or 30&lt;/code&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;错误日志&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;出错时保留上下文&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;记录输入参数、调用栈、时间&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;43-踩坑实例忘记处理边界&#34;&gt;4.3 踩坑实例：忘记处理边界&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 坏例子&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;get_user_name&lt;/span&gt;(users, index):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; users[index]&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;name
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 好例子&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;get_user_name&lt;/span&gt;(users, index):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; users &lt;span style=&#34;color:#f92672&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;raise&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ValueError&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;users list cannot be None&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; index &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;or&lt;/span&gt; index &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; len(users):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;raise&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;IndexError&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;index &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;index&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; out of range for users list&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    user &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; users[index]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; user &lt;span style=&#34;color:#f92672&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;raise&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;ValueError&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;user at index &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;index&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt; is None&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; user&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;name&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;p&gt;第二个版本虽然长，但它明确告诉调用者：&lt;strong&gt;什么情况下会出错、为什么出错&lt;/strong&gt;。这对排障非常重要。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;感悟&lt;/strong&gt;：防御式编程不是“把代码写复杂”，而是“把失败路径也纳入设计”。一个只考虑正常路径的程序，上线后一定会遇到意外。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;5-变量与数据让状态可控&#34;&gt;5. 变量与数据：让状态可控&lt;/h2&gt;
&lt;p&gt;变量是程序状态的载体。变量用不好，代码就会充满“魔法值”和“隐式依赖”。&lt;/p&gt;
&lt;h3 id=&#34;51-变量使用的最佳实践&#34;&gt;5.1 变量使用的最佳实践&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;声明时初始化&lt;/strong&gt;：不要声明一个变量后过了很久才赋值。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缩小作用域&lt;/strong&gt;：能用局部变量就不要用全局变量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;避免魔法数字&lt;/strong&gt;：用常量或枚举代替裸数字。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一次只干一件事&lt;/strong&gt;：不要一个变量身兼数职。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;命名反映生命周期&lt;/strong&gt;：临时变量、循环变量也要有清晰名字。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;52-魔法数字改造示例&#34;&gt;5.2 魔法数字改造示例&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 坏例子&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; status &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    send_reminder()
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 好例子&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ORDER_STATUS_PENDING_PAYMENT &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; status &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; ORDER_STATUS_PENDING_PAYMENT:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    send_reminder()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;p&gt;第二个版本不需要查文档，也不需要猜“3 是什么意思”。&lt;/p&gt;
&lt;h3 id=&#34;53-变量生命周期示意图&#34;&gt;5.3 变量生命周期示意图&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[变量声明] --&amp;gt; B[初始化]
    B --&amp;gt; C[使用]
    C --&amp;gt; D[释放/超出作用域]
    style B fill:#fff9c4
    style D fill:#ffcdd2&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;感悟&lt;/strong&gt;：好的变量管理，本质上是“让程序状态可见、可控、可预测”。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;6-代码布局与风格让阅读更顺畅&#34;&gt;6. 代码布局与风格：让阅读更顺畅&lt;/h2&gt;
&lt;p&gt;代码是写给人看的，顺便给机器执行。一致的代码布局能大幅降低团队的阅读成本。&lt;/p&gt;
&lt;h3 id=&#34;61-布局的核心原则&#34;&gt;6.1 布局的核心原则&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;原则&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;说明&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;一致性&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;团队统一一种风格，不要混用&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;垂直分组&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;相关代码放在一起，用空行分隔逻辑块&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;水平对齐&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;适当的缩进和对齐，体现层级关系&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;注释说明“为什么”&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;不要复述代码做了什么，要解释为什么这么做&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;避免过度注释&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;代码能自解释的，就不要注释&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;62-代码布局示例&#34;&gt;6.2 代码布局示例&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 坏例子：格式混乱，缺少空行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;calc&lt;/span&gt;(a,b,c):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; a&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        x&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;b&lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt;c
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; x&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;a
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 好例子：结构清晰&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;calculate_total&lt;/span&gt;(base_price, quantity, tax_rate):
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; base_price &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    subtotal &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; base_price &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; quantity
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tax &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; subtotal &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; tax_rate
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; subtotal &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; tax&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;7-调试与测试不要害怕-bug&#34;&gt;7. 调试与测试：不要害怕 bug&lt;/h2&gt;
&lt;p&gt;《代码大全》把调试和测试也归为“软件构建”的重要组成部分。对于新人来说，建立正确的调试观念比掌握某个调试工具更重要。&lt;/p&gt;
&lt;h3 id=&#34;71-调试的正确心态&#34;&gt;7.1 调试的正确心态&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    A[发现 Bug] --&amp;gt; B[不要急着改代码]
    B --&amp;gt; C[复现问题]
    C --&amp;gt; D[定位根因]
    D --&amp;gt; E[编写测试覆盖该场景]
    E --&amp;gt; F[修复并验证]
    F --&amp;gt; G[复盘：为什么会引入]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;72-测试的价值&#34;&gt;7.2 测试的价值&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;单元测试&lt;/strong&gt;：验证最小功能单元是否正确；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;集成测试&lt;/strong&gt;：验证多个模块协作是否正常；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;回归测试&lt;/strong&gt;：改完代码后，确保旧功能没坏。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;感悟&lt;/strong&gt;：调试不是“找错”，而是“理解程序为什么会这样表现”。很多时候，bug 是设计或假设的问题，不是代码敲错了。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;8-代码质量的良性循环&#34;&gt;8. 代码质量的良性循环&lt;/h2&gt;
&lt;p&gt;好代码不是一次性写成的，而是通过持续的小改进积累出来的。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[清晰命名] --&amp;gt; B[短小函数]
    B --&amp;gt; C[防御式编程]
    C --&amp;gt; D[充分测试]
    D --&amp;gt; E[持续重构]
    E --&amp;gt; A
    style A fill:#e1f5e1
    style B fill:#e1f5e1
    style C fill:#e1f5e1
    style D fill:#e1f5e1
    style E fill:#e1f5e1&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;这个循环的每一个环节都在降低系统的复杂度，让代码越来越容易维护。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;9-我的思考与感悟&#34;&gt;9. 我的思考与感悟&lt;/h2&gt;
&lt;h3 id=&#34;91-编程是手艺不是灵感&#34;&gt;9.1 编程是手艺，不是灵感&lt;/h3&gt;
&lt;p&gt;很多新人（包括我当初）觉得“写代码靠灵感”。但《代码大全》让我意识到，&lt;strong&gt;优秀代码背后是一系列可学习、可练习、可检查的技术&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;命名怎么取、函数怎么拆、异常怎么处理、代码怎么布局——这些都有明确的原则。掌握了原则，再结合实际项目不断练习，代码质量自然会提升。&lt;/p&gt;
&lt;h3 id=&#34;92-能跑不是终点&#34;&gt;9.2 “能跑”不是终点&lt;/h3&gt;
&lt;p&gt;初学编程时，我经常以“代码能跑”为标准。但工作中逐渐发现：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;能跑的代码，一个月后可能自己都看不懂；&lt;/li&gt;
&lt;li&gt;能跑的代码，加一个新需求可能要改很多地方；&lt;/li&gt;
&lt;li&gt;能跑的代码，给别人 review 时会被打回来重写。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;好的代码不仅要正确，还要可读、可维护、可扩展。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;93-不要一次性追求完美&#34;&gt;9.3 不要一次性追求完美&lt;/h3&gt;
&lt;p&gt;《代码大全》不是要你一次性写出完美代码，而是鼓励&lt;strong&gt;持续改进&lt;/strong&gt;。先让代码工作，再让它正确，再让它清晰，最后才考虑性能优化。过早优化往往是万恶之源。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;10-踩坑实践我真实犯过的错&#34;&gt;10. 踩坑实践：我真实犯过的错&lt;/h2&gt;
&lt;h3 id=&#34;101-坑一函数太长逻辑纠缠&#34;&gt;10.1 坑一：函数太长，逻辑纠缠&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：写一个用户注册接口，把所有逻辑塞在一个函数里：校验参数、查数据库、发邮件、写日志。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;后果&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;单元测试没法写，只能端到端测；&lt;/li&gt;
&lt;li&gt;邮件服务挂掉，整个注册接口都失败；&lt;/li&gt;
&lt;li&gt;改一个小逻辑，要滚动好几屏。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;改进&lt;/strong&gt;：按照职责拆分成 &lt;code&gt;validate_input&lt;/code&gt;、&lt;code&gt;check_duplicate&lt;/code&gt;、&lt;code&gt;create_user&lt;/code&gt;、&lt;code&gt;send_welcome_email&lt;/code&gt;、&lt;code&gt;log_registration&lt;/code&gt; 等函数。&lt;/p&gt;
&lt;h3 id=&#34;102-坑二变量命名太随意&#34;&gt;10.2 坑二：变量命名太随意&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：用 &lt;code&gt;a&lt;/code&gt;、&lt;code&gt;b&lt;/code&gt;、&lt;code&gt;tmp&lt;/code&gt;、&lt;code&gt;data&lt;/code&gt; 作为变量名。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;后果&lt;/strong&gt;：两周后回来看代码，完全不知道这些变量代表什么，调试时也非常痛苦。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;改进&lt;/strong&gt;：每个变量名都尽量说明它的含义和用途，比如 &lt;code&gt;rawCsvContent&lt;/code&gt;、&lt;code&gt;parsedUserList&lt;/code&gt;、&lt;code&gt;retryCount&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;103-坑三不做参数校验&#34;&gt;10.3 坑三：不做参数校验&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：写一个根据用户 ID 查询信息的函数，直接拿参数去查数据库。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;后果&lt;/strong&gt;：某天前端传了一个空字符串，导致 SQL 报错；更严重时可能被注入攻击。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;改进&lt;/strong&gt;：在入口层就校验参数类型、长度、范围，不信任任何外部输入。&lt;/p&gt;
&lt;h3 id=&#34;104-坑四过度注释&#34;&gt;10.4 坑四：过度注释&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：每一行代码都加注释，生怕别人看不懂。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;后果&lt;/strong&gt;：注释和代码不同步，反而误导阅读者；真正需要解释的地方反而没注释。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;改进&lt;/strong&gt;：注释说明“为什么”和“设计意图”，代码本身说明“做了什么”。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;11-给新人的学习建议&#34;&gt;11. 给新人的学习建议&lt;/h2&gt;
&lt;p&gt;如果你刚读完《代码大全》或者准备读，可以按照下面这个路线来：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[先读第 1～7 章&amp;lt;br/&amp;gt;建立构建全景] --&amp;gt; B[重点读命名、函数、防御式编程]
    B --&amp;gt; C[结合自己项目&amp;lt;br/&amp;gt;刻意练习]
    C --&amp;gt; D[做一份个人代码检查清单]
    D --&amp;gt; E[Review 别人代码&amp;lt;br/&amp;gt;也接受别人 Review]
    E --&amp;gt; F[定期重构旧代码]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;推荐建立的个人检查清单&#34;&gt;推荐建立的个人检查清单&lt;/h3&gt;
&lt;p&gt;在提交代码前，问自己几个问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 变量和函数名是否能清楚表达意图？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 每个函数是否只负责一件事？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 参数数量是否控制在 3 个以内？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 是否处理了异常和边界情况？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 是否有重复代码可以抽取？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 是否添加了必要的测试？&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 注释是否说明了“为什么”而不是复述“做什么”？&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;12-结语&#34;&gt;12. 结语&lt;/h2&gt;
&lt;p&gt;《代码大全》是一本值得放在手边、反复翻阅的书。它不会教你某个框架怎么用，也不会教你某种语言的语法，但它会告诉你：&lt;strong&gt;一个专业程序员应该怎样思考和构建代码&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;对于新人来说，不需要一次性读完。可以先建立整体认知，再在遇到具体问题时回头查对应章节。最重要的是，把书中的原则应用到日常编码中，逐渐形成自己的代码审美。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;好代码不是写出来的，是改出来的。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;希望这篇文章能帮你少走一些弯路，写出更干净、更可靠的代码。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;参考书籍&lt;/strong&gt;：Steve McConnell《代码大全（第 2 版）》&lt;br&gt;
&lt;strong&gt;延伸阅读&lt;/strong&gt;：《重构》《代码整洁之道》《程序员修炼之道》&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
