Files

131 lines
3.4 KiB
Markdown
Raw Permalink Normal View History

2026-09-21 17:11:35 +08:00
# 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 应该放在哪一层?