AI4SE_Practices/AI4SE-survey/test-standards/test-tasks/task3-refactor.md

233 lines
6.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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模式
- 添加适当的异常类型
---
**注意**:此任务评估工具在代码重构、安全修复和代码质量提升方面的综合能力。重构后的代码应该保持功能完整性的同时显著提升代码质量。