跳转到内容

编程基础概念

程序通常在重复四件事:接收输入 → 处理数据 → 做出判断 → 输出结果。语言语法不同,但这些思路相通。

输入:用户填写的邮箱
处理:去掉空格并检查格式
判断:格式正确吗?
输出:保存,或提示如何修改

变量给数据一个名字;类型描述数据可以怎样使用。常见类型包括字符串、数字、布尔值、空值、数组和对象。

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);
}
}

面向对象把数据和行为组织在对象中;函数式思路强调纯函数、不可变数据和组合。它们不是只能二选一的宗教,按团队、语言和问题选择更容易维护的写法即可。

把一段你看不懂的代码交给 Agent 时,要求它:

  1. 先用日常语言说出输入、处理和输出;
  2. 标出变量、函数、条件、循环和外部请求;
  3. 给出一个正常输入、一个边界输入和预期结果;
  4. 不要直接重写,先解释可能的错误和验证方式。

做一个“课程列表”小程序:支持读取列表、按标题搜索、标记已完成,并为网络失败和空列表显示提示。先用本地假数据,再接一个真实 API。