🏠

渐进式编程实战

个人记账本项目

从5行代码开始,体验编程的演进之旅

讲师:乌鸦哥

今天的学习目标

  • 📝 从最简单的代码开始
  • 😵 体验代码重复的痛苦
  • 💡 发现函数的神奇
  • 📦 学会使用别人的工具
  • 🏗️ 掌握代码整理技巧

让痛点推动学习,让需求催生解决方案!

为什么选择记账本?

  • 🤑 人人都要管钱,贴近生活
  • 🧮 加减法简单,容易理解
  • 📈 功能可以一步步增加
  • 😊 看到自己的钱很有成就感

生活中最实用的编程项目!

第一步:超简单开始

只有3行代码!

记录一笔收入

let money = 1000;
console.log("收入1000元,工资");
console.log("余额:1000元");

运行结果:

收入1000元,工资
余额:1000元

这也太简单了!

第二步:加个支出

代码开始重复了...

既要记收入,也要记支出

let balance = 0;

// 收入
balance = balance + 5000;
console.log("收入5000元,工资");
console.log("余额:" + balance + "元");

// 支出
balance = balance - 1200;
console.log("支出1200元,房租");
console.log("余额:" + balance + "元");

还行,但有点重复...

第三步:一个月的账单

重复代码很烦!

需要记录30笔收支

let balance = 0;

// 第1笔
balance = balance + 5000;
console.log("收入5000元,工资");
console.log("余额:" + balance + "元");

// 第2笔
balance = balance - 1200;
console.log("支出1200元,房租");
console.log("余额:" + balance + "元");

// 第3笔
balance = balance - 300;
console.log("支出300元,买菜");
console.log("余额:" + balance + "元");

// ... 还有27笔,都是重复的代码!

问题来了!

  • 😫 复制粘贴累死人:同样的代码写30遍
  • 😰 容易改错:复制时忘记改数字
  • 😵 想改格式要改30个地方
  • 😤 老板说再加20笔...

学员感受:天哪,这样下去会疯掉!

🤔 思考时间

如果老板让你记录一整年的账单...

365笔记录,你还愿意复制粘贴吗?

肯定有更好的办法!

第四步:函数拯救世界

重复代码消失了!

把重复的代码变成函数

let balance = 0;

// 函数:记录收入
function addIncome(amount, description) {
    balance = balance + amount;
    console.log("收入" + amount + "元," + description);
    console.log("余额:" + balance + "元");
}

// 函数:记录支出  
function addExpense(amount, description) {
    balance = balance - amount;
    console.log("支出" + amount + "元," + description);
    console.log("余额:" + balance + "元");
}

使用函数超级简单

// 一行代码搞定一笔记录
addIncome(5000, "工资");
addExpense(1200, "房租");
addExpense(300, "买菜");
addIncome(500, "兼职");
addExpense(200, "交通");

输出结果:

收入5000元,工资
余额:5000元
支出1200元,房租
余额:3800元
支出300元,买菜
余额:3500元
...

函数的神奇之处

  • 50行代码变成5行
  • 🎯 一眼看懂在干什么
  • 🛠️ 改格式只需改一个地方
  • 🚀 添加记录只需一行
  • 🎉 不会复制错了

哇!函数太神奇了!

🎯 什么是函数?

函数 = 给常用操作起个名字

就像手机里的快捷键一样

  • 📝 定义一次:把重复的代码写好
  • ♻️ 想用就用:调用函数名就行
  • 🎛️ 可以传参数:每次传不同的数字

比喻:就像遥控器的按钮,按一下执行一套动作!

第五步:遇到复杂功能

日期处理太难了

老板要求:每笔账都要记录日期

function getCurrentDate() {
    let now = new Date();
    let year = now.getFullYear();
    let month = now.getMonth() + 1;
    let day = now.getDate();
    
    // 月份小于10要补0
    if (month < 10) month = "0" + month;
    if (day < 10) day = "0" + day;
    
    return year + "-" + month + "-" + day;
}

// 还要处理:
// - 计算两个日期相差多少天
// - 判断是不是月末
// - 处理闰年
// ... 又是几十行复杂代码

日期处理的痛苦

  • 😵 格式化麻烦:月份要补0,各种格式
  • 🤯 计算复杂:两个日期差几天?
  • 😰 边界情况多:月末、年末、闰年...
  • 🐛 容易出错:一个小bug调试半天

学员感受:日期处理好复杂!能不能用现成的?

💡 又一个发现

肯定有程序员已经解决过日期问题!

为什么要自己重新写?

包(Package)闪亮登场!

第六步:使用别人的包

站在巨人的肩膀上

安装日期处理包

// 在命令行运行一下
npm install moment

然后在代码中使用:

// 导入moment包
const moment = require('moment');

function addIncome(amount, description) {
    // 用moment处理日期,一行搞定!
    let date = moment().format('YYYY-MM-DD');
    balance = balance + amount;
    console.log(date + " 收入" + amount + "元," + description);
}

包的威力

  • 🚀 几十行代码变成1行
  • 🛡️ 久经考验:被千万个项目使用
  • 🐛 bug很少:专业团队维护
  • 📚 功能丰富:什么日期操作都有
  • 免费使用:开源社区的礼物

用别人的包太爽了!

🎯 什么是包?

包 = 别人写好的工具箱

就像去超市买现成的调料

  • 🏪 npm商店:程序员的超市
  • 📦 一键安装:npm install 包名
  • 📥 导入使用:require('包名')

比喻:就像用现成的轮子,不用自己造!

第七步:项目变大了

一个文件装不下了

功能越来越多

// app.js 文件变得超级长
let balance = 0;
let records = [];

// 账户功能
function addIncome() { ... }
function addExpense() { ... }

// 统计功能  
function showSummary() { ... }
function getMonthlyReport() { ... }

// 报表功能
function exportToExcel() { ... }
function generateChart() { ... }

// 预算功能
function setBudget() { ... }
function checkBudget() { ... }

// ... 200多行代码都挤在一个文件里

单文件地狱

  • 😱 文件超级长:滚动条像细线
  • 🔍 找不到函数:翻半天才找到
  • 👥 多人冲突:都改同一个文件
  • 🧩 功能混乱:账户、统计、报表混在一起

代码又乱了!找个函数要翻半天!

💡 最后的发现

我们需要把相关的功能分开放

就像整理房间,把东西分类

模块化闪亮登场!

第八步:模块化整理

井井有条的项目

重新整理项目结构

记账项目/
├── app.js                    ← 主程序(很短)
├── modules/                  ← 我们的模块
│   ├── account.js            ← 账户管理
│   ├── statistics.js         ← 统计计算  
│   └── reports.js            ← 报表生成
└── node_modules/             ← 外部包
    └── moment/               ← 日期处理包

主程序 app.js(超级简洁)

// 导入我们的模块
const account = require('./modules/account');
const statistics = require('./modules/statistics');

// 使用模块功能
account.addIncome(5000, '工资');
account.addExpense(1200, '房租');
account.addExpense(300, '买菜');

// 查看统计
statistics.showSummary();

账户模块 account.js

// 只管账户相关的事情
let balance = 0;

function addIncome(amount, description) {
    balance += amount;
    console.log(`收入${amount}元,${description}`);
}

function addExpense(amount, description) {
    balance -= amount;
    console.log(`支出${amount}元,${description}`);
}

// 导出功能给别人用
module.exports = {
    addIncome,
    addExpense
};

模块化的好处

  • 🗂️ 分工明确:每个文件负责一类事情
  • 🔍 容易找到:知道去哪个文件找功能
  • 👥 团队合作:不同人负责不同模块
  • 🛠️ 容易改:改统计功能只改统计文件
  • ♻️ 可以复用:其他项目也能用

整个项目清清楚楚!太舒服了!

🎯 什么是模块?

模块 = 把相关功能放一起

就像整理衣柜,同类衣服放一个格子

  • 📁 分类存放:相关函数放同一文件
  • 📤 导出功能:module.exports
  • 📥 导入使用:require('./文件名')

比喻:就像乐高积木,不同形状组装成大作品!

三大神器总结

从乱到整的演进过程

阶段 问题 解决方案
简单开始 功能简单 直接写代码
功能增加 代码重复 👉 使用函数
复杂功能 实现困难 👉 使用别人的包
项目变大 代码混乱 👉 模块化整理

编程三大神器

🎯 函数

消除重复

遥控器按钮

📦 包

解决复杂

现成的轮子

🗂️ 模块

整理代码

分类整理

什么时候用什么?

  • 代码重复 → 写函数
  • 功能复杂 → 找个包
  • 文件太乱 → 拆成模块

记住:程序员都是懒人,能偷懒就偷懒!

恭喜你!🎉

你已经掌握了编程的核心思想

  • 🎯 函数 - 不写重复代码
  • 📦 - 用别人的成果
  • 🗂️ 模块 - 把代码整理好

编程金句

好程序员不是写代码最多的,是写重复代码最少的!

下节课我们用这些思想搭建真正的网站