forked from wangtao/AI4SE_Practices
233 lines
6.1 KiB
Markdown
233 lines
6.1 KiB
Markdown
# Task 3: Legacy代码重构(复杂任务)
|
||
|
||
## 任务描述
|
||
|
||
给定一段Python legacy代码,使用AI工具辅助重构,要求:
|
||
|
||
1. 提升代码可读性
|
||
2. 修复潜在的安全漏洞
|
||
3. 优化性能和结构
|
||
4. 添加适当的错误处理
|
||
5. 符合PEP8规范和现代Python最佳实践
|
||
|
||
## 初始条件
|
||
|
||
- **初始代码**:提供legacy代码文件
|
||
- **项目类型**:Python项目
|
||
- **Python版本**:3.10+
|
||
- **目标框架**:保持原有功能,但提升代码质量
|
||
|
||
### 原始代码(Legacy)
|
||
|
||
```python
|
||
import os
|
||
import sqlite3
|
||
import hashlib
|
||
|
||
def process_user_data(username, password, email):
|
||
conn = sqlite3.connect('users.db')
|
||
cursor = conn.cursor()
|
||
|
||
# 检查用户是否已存在
|
||
cursor.execute("SELECT * FROM users WHERE username = '" + username + "'")
|
||
existing_user = cursor.fetchone()
|
||
|
||
if existing_user:
|
||
return {"status": "error", "message": "用户已存在"}
|
||
|
||
# 简单的密码hash(不安全)
|
||
password_hash = hashlib.md5(password.encode()).hexdigest()
|
||
|
||
# 插入新用户
|
||
try:
|
||
cursor.execute("INSERT INTO users (username, password, email) VALUES ('" + username + "', '" + password_hash + "', '" + email + "')")
|
||
conn.commit()
|
||
|
||
# 获取用户ID
|
||
cursor.execute("SELECT id FROM users WHERE username = '" + username + "'")
|
||
user = cursor.fetchone()
|
||
|
||
if user:
|
||
user_id = user[0]
|
||
# 创建用户目录
|
||
user_dir = f"/data/users/{user_id}"
|
||
os.makedirs(user_dir, exist_ok=True)
|
||
|
||
# 创建配置文件
|
||
config_file = f"{user_dir}/config.txt"
|
||
with open(config_file, 'w') as f:
|
||
f.write(f"user_id={user_id}\nusername={username}\nemail={email}")
|
||
|
||
return {"status": "success", "user_id": user_id}
|
||
else:
|
||
return {"status": "error", "message": "创建用户失败"}
|
||
except Exception as e:
|
||
return {"status": "error", "message": str(e)}
|
||
finally:
|
||
conn.close()
|
||
|
||
def get_user_info(user_id):
|
||
conn = sqlite3.connect('users.db')
|
||
cursor = conn.cursor()
|
||
|
||
cursor.execute("SELECT * FROM users WHERE id = " + str(user_id))
|
||
user = cursor.fetchone()
|
||
|
||
if user:
|
||
return {
|
||
"id": user[0],
|
||
"username": user[1],
|
||
"email": user[3]
|
||
}
|
||
else:
|
||
return None
|
||
conn.close()
|
||
|
||
def delete_user(user_id):
|
||
conn = sqlite3.connect('users.db')
|
||
cursor = conn.cursor()
|
||
|
||
try:
|
||
# 删除用户目录
|
||
user_dir = f"/data/users/{user_id}"
|
||
if os.path.exists(user_dir):
|
||
import shutil
|
||
shutil.rmtree(user_dir)
|
||
|
||
# 删除数据库记录
|
||
cursor.execute("DELETE FROM users WHERE id = " + str(user_id))
|
||
conn.commit()
|
||
|
||
return {"status": "success"}
|
||
except Exception as e:
|
||
return {"status": "error", "message": str(e)}
|
||
finally:
|
||
conn.close()
|
||
```
|
||
|
||
### 代码问题分析
|
||
|
||
1. **SQL注入漏洞**:使用字符串拼接构造SQL查询
|
||
2. **不安全的密码哈希**:使用MD5(已不安全)
|
||
3. **硬编码路径**:`/data/users/`硬编码
|
||
4. **资源泄漏**:数据库连接可能未正确关闭
|
||
5. **错误处理不充分**:异常处理过于宽泛
|
||
6. **代码结构问题**:函数职责不单一,缺少类型提示
|
||
7. **魔法值**:硬编码的字符串和路径
|
||
8. **代码重复**:数据库连接逻辑重复
|
||
|
||
## 验收标准
|
||
|
||
### 安全性
|
||
|
||
- [ ] 消除SQL注入漏洞(使用参数化查询)
|
||
- [ ] 使用安全的密码哈希算法(bcrypt或argon2)
|
||
- [ ] 输入验证和清理
|
||
|
||
### 代码质量
|
||
|
||
- [ ] 符合PEP8规范
|
||
- [ ] 添加类型提示
|
||
- [ ] 函数职责单一,代码结构清晰
|
||
- [ ] 适当的注释和文档字符串
|
||
|
||
### 可维护性
|
||
|
||
- [ ] 消除硬编码值(使用配置或常量)
|
||
- [ ] 消除代码重复(提取公共函数)
|
||
- [ ] 改进错误处理(具体的异常类型)
|
||
|
||
### 性能
|
||
|
||
- [ ] 优化数据库查询(如适用)
|
||
- [ ] 资源管理正确(使用上下文管理器)
|
||
|
||
### 功能完整性
|
||
|
||
- [ ] 保持原有功能不变
|
||
- [ ] 所有边界条件处理正确
|
||
|
||
## 测试步骤
|
||
|
||
1. **代码分析**
|
||
- 使用工具分析legacy代码
|
||
- 记录工具识别出的问题
|
||
|
||
2. **重构方案**
|
||
- 使用工具生成重构方案
|
||
- 记录工具生成的重构代码
|
||
- 记录人工调整的点和原因
|
||
|
||
3. **验证测试**
|
||
- 运行重构后的代码
|
||
- 验证功能正确性
|
||
- 进行安全测试(如SQL注入测试)
|
||
- 记录测试结果
|
||
|
||
## 评估要点
|
||
|
||
### 问题识别能力
|
||
|
||
- **全面性**:是否能识别出所有问题(安全、性能、结构等)
|
||
- **优先级**:是否能正确评估问题的严重性
|
||
|
||
### 重构方案质量
|
||
|
||
- **正确性**:重构方案是否正确且安全
|
||
- **完整性**:是否解决了所有问题
|
||
- **平衡性**:是否在代码质量和实用性之间取得平衡
|
||
|
||
### 代码质量提升
|
||
|
||
- **可读性**:重构后的代码是否更易读
|
||
- **可维护性**:代码结构是否更易维护
|
||
- **规范性**:是否符合现代Python最佳实践
|
||
|
||
### 工具使用体验
|
||
|
||
- **响应速度**:工具分析代码的速度
|
||
- **交互便利性**:需要多少次交互才能完成重构
|
||
|
||
## 期望的重构方向
|
||
|
||
### 安全改进
|
||
|
||
```python
|
||
# 使用参数化查询
|
||
cursor.execute("SELECT * FROM users WHERE username = ?", (username,))
|
||
|
||
# 使用安全的密码哈希
|
||
import bcrypt
|
||
password_hash = bcrypt.hashpw(password.encode(), bcrypt.gensalt()).decode()
|
||
```
|
||
|
||
### 结构改进
|
||
|
||
```python
|
||
# 使用数据库上下文管理器
|
||
from contextlib import contextmanager
|
||
|
||
@contextmanager
|
||
def get_db_connection():
|
||
conn = sqlite3.connect('users.db')
|
||
try:
|
||
yield conn
|
||
finally:
|
||
conn.close()
|
||
|
||
# 使用配置类
|
||
class Config:
|
||
USER_DATA_DIR = os.getenv('USER_DATA_DIR', '/data/users')
|
||
```
|
||
|
||
### 代码组织
|
||
|
||
- 分离数据库操作和业务逻辑
|
||
- 使用数据访问层(DAO)模式
|
||
- 添加适当的异常类型
|
||
|
||
---
|
||
|
||
**注意**:此任务评估工具在代码重构、安全修复和代码质量提升方面的综合能力。重构后的代码应该保持功能完整性的同时显著提升代码质量。
|
||
|