# 09 思考内容:从单文件到项目结构 前 8 个文件的学习路线是: 1. 先理解 Python = 算法 + 数据。 2. 再用列表和字典完成学生增删改查。 3. 再用函数拆分逻辑。 4. 再用类组织数据和行为。 5. 再用反射简化菜单分发。 6. 再用 JSON 文件实现持久化。 7. 再连接 MySQL 数据库。 8. 最后用 SQLAlchemy ORM 把表映射成对象。 ## 一、为什么要划分文件夹? 单文件适合教学入门,因为学生能在一个文件里看到所有逻辑。 但项目变大后,单文件会出现几个问题: 1. 代码太长,不容易阅读。 2. 数据模型、业务逻辑、界面输入输出混在一起。 3. 学生功能、老师功能、课程功能放在一起会互相影响。 4. 修改一个功能时,很容易误改其他功能。 所以项目变大后,要开始划分模块。 ## 二、常见目录划分 可以按 MVC 思想划分: ```text 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:程序入口,只负责启动程序。 ## 三、如果增加老师管理,怎么做? 老师和学生本质一样,都是一种数据资源。 老师的数据可以设计为: ```python teacher = { "id": 1, "name": "王老师", "subject": "Python", "phone": "13800000000", } ``` 老师也需要增删改查: 1. add_teacher 2. list_teachers 3. search_teacher 4. update_teacher 5. delete_teacher 如果使用 MVC,可以新增: ```text models/teacher.py controllers/teacher_controller.py repositories/teacher_repository.py ``` ## 四、如果增加课程管理,怎么做? 课程的数据可以设计为: ```python 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 应该放在哪一层?