mirror of
http://47.106.207.27:3000/Jeremy_liu/AI0814_jiaoan_public.git
synced 2026-09-27 06:14:14 +08:00
131 lines
3.4 KiB
Markdown
131 lines
3.4 KiB
Markdown
# 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 应该放在哪一层?
|