Files
AI0814_jiaoan_public/w0_d6/09_thinking_extension.md
2026-09-21 17:11:35 +08:00

3.4 KiB
Raw Permalink Blame History

09 思考内容:从单文件到项目结构

前 8 个文件的学习路线是:

  1. 先理解 Python = 算法 + 数据。
  2. 再用列表和字典完成学生增删改查。
  3. 再用函数拆分逻辑。
  4. 再用类组织数据和行为。
  5. 再用反射简化菜单分发。
  6. 再用 JSON 文件实现持久化。
  7. 再连接 MySQL 数据库。
  8. 最后用 SQLAlchemy ORM 把表映射成对象。

一、为什么要划分文件夹?

单文件适合教学入门,因为学生能在一个文件里看到所有逻辑。

但项目变大后,单文件会出现几个问题:

  1. 代码太长,不容易阅读。
  2. 数据模型、业务逻辑、界面输入输出混在一起。
  3. 学生功能、老师功能、课程功能放在一起会互相影响。
  4. 修改一个功能时,很容易误改其他功能。

所以项目变大后,要开始划分模块。

二、常见目录划分

可以按 MVC 思想划分:

project/
    main.py
    models/
        student.py
        teacher.py
        course.py
    controllers/
        student_controller.py
        teacher_controller.py
        course_controller.py
    views/
        cli_view.py
    repositories/
        student_repository.py
        teacher_repository.py
        course_repository.py
    data/
        students.json
        teachers.json
        courses.json

每一层的职责:

  1. model:定义数据长什么样,比如 Student、Teacher、Course。
  2. repository:负责数据保存和读取,比如保存到 JSON、MySQL。
  3. controller:负责业务流程,比如添加学生、删除学生。
  4. view:负责和用户交互,比如 input 和 print。
  5. main:程序入口,只负责启动程序。

三、如果增加老师管理,怎么做?

老师和学生本质一样,都是一种数据资源。

老师的数据可以设计为:

teacher = {
    "id": 1,
    "name": "王老师",
    "subject": "Python",
    "phone": "13800000000",
}

老师也需要增删改查:

  1. add_teacher
  2. list_teachers
  3. search_teacher
  4. update_teacher
  5. delete_teacher

如果使用 MVC,可以新增:

models/teacher.py
controllers/teacher_controller.py
repositories/teacher_repository.py

四、如果增加课程管理,怎么做?

课程的数据可以设计为:

course = {
    "id": 1,
    "name": "Python 基础",
    "teacher_id": 1,
    "classroom": "A101",
}

课程的难点是它和老师、学生会产生关系:

  1. 一个老师可以教多门课程。
  2. 一个课程可以有多个学生。
  3. 一个学生也可以选择多门课程。

所以课程管理除了增删改查,还可以继续扩展:

  1. 给课程分配老师。
  2. 给课程添加学生。
  3. 查看某个老师负责的课程。
  4. 查看某个学生选择的课程。

五、课堂思考题

  1. 为什么列表适合保存多个学生?
  2. 为什么一个学生适合用字典或类表示?
  3. 函数版本比纯列表版本好在哪里?
  4. 类版本中,Student 和 StudentManager 的职责有什么区别?
  5. 反射版本为什么可以减少 if/elif?
  6. JSON 持久化和数据库持久化有什么区别?
  7. ORM 为什么可以让我们少写 SQL?
  8. 如果新增老师管理,你会复制学生管理代码,还是抽取公共代码?
  9. 学生、老师、课程之间的关系如何用数据库表表示?
  10. MVC 中,input 和 print 应该放在哪一层?