编程基础概念
先理解程序在做什么
Section titled “先理解程序在做什么”程序通常在重复四件事:接收输入 → 处理数据 → 做出判断 → 输出结果。语言语法不同,但这些思路相通。
输入:用户填写的邮箱处理:去掉空格并检查格式判断:格式正确吗?输出:保存,或提示如何修改变量给数据一个名字;类型描述数据可以怎样使用。常见类型包括字符串、数字、布尔值、空值、数组和对象。
const name = 'EasyAI';const lessons = 12;const published = true;const tags = ['AI', 'Web'];const course = { name, lessons, published };不要把所有数据都当字符串。日期、金额、ID、布尔值和用户输入需要明确规则,并在边界处验证。
条件让程序根据情况选择路径;循环让程序重复处理一组数据。
for item in lessons: if item["published"]: print(item["title"])循环中要考虑空列表、异常数据和规模变大后的速度。不要在不确定结束条件的循环里修改同一个集合。
函数把一件有名字的工作封装起来,输入和输出越清楚,越容易测试和复用。
function formatPrice(amount, currency = 'CNY') { if (!Number.isFinite(amount) || amount < 0) { throw new Error('金额必须是非负数字'); } return new Intl.NumberFormat('zh-CN', { style: 'currency', currency }).format(amount);}一个函数最好有单一目的;当文件越来越长时,把相关函数拆成模块,并明确谁可以调用它。
- 数组:按顺序保存多个值;
- 对象/字典:用键找到值;
- 集合:强调不重复;
- 栈和队列:分别适合后进先出、先进先出的任务;
- 树和图:适合层级、依赖和连接关系。
先选择最能表达业务规则的结构,再考虑优化。过早追求复杂算法,会让代码更难理解。
错误不是“程序很差”,而是系统需要明确处理的情况:网络中断、输入不完整、权限不足、资源不存在或第三方服务超时。
try { const response = await fetch('/api/profile'); if (!response.ok) throw new Error(`HTTP ${response.status}`); return await response.json();} catch (error) { console.error('读取资料失败', error); return { error: '暂时无法读取,请稍后重试' };}给用户看的提示要可行动;给开发者的日志要保留上下文,但不要泄露密钥和隐私。
网络请求、文件读写和定时任务可能需要等待。异步代码允许程序在等待时处理其他工作,但必须处理加载、成功、失败和取消。
async function loadLessons() { setLoading(true); try { return await fetch('/api/lessons').then((res) => res.json()); } finally { setLoading(false); }}面向对象和函数式思路
Section titled “面向对象和函数式思路”面向对象把数据和行为组织在对象中;函数式思路强调纯函数、不可变数据和组合。它们不是只能二选一的宗教,按团队、语言和问题选择更容易维护的写法即可。
用 AI 学基础概念
Section titled “用 AI 学基础概念”把一段你看不懂的代码交给 Agent 时,要求它:
- 先用日常语言说出输入、处理和输出;
- 标出变量、函数、条件、循环和外部请求;
- 给出一个正常输入、一个边界输入和预期结果;
- 不要直接重写,先解释可能的错误和验证方式。
做一个“课程列表”小程序:支持读取列表、按标题搜索、标记已完成,并为网络失败和空列表显示提示。先用本地假数据,再接一个真实 API。