forked from Kexing/AI4SE_Practices
6.1 KiB
6.1 KiB
Task 3: Legacy代码重构(复杂任务)
任务描述
给定一段Python legacy代码,使用AI工具辅助重构,要求:
- 提升代码可读性
- 修复潜在的安全漏洞
- 优化性能和结构
- 添加适当的错误处理
- 符合PEP8规范和现代Python最佳实践
初始条件
- 初始代码:提供legacy代码文件
- 项目类型:Python项目
- Python版本:3.10+
- 目标框架:保持原有功能,但提升代码质量
原始代码(Legacy)
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()
代码问题分析
- SQL注入漏洞:使用字符串拼接构造SQL查询
- 不安全的密码哈希:使用MD5(已不安全)
- 硬编码路径:
/data/users/硬编码 - 资源泄漏:数据库连接可能未正确关闭
- 错误处理不充分:异常处理过于宽泛
- 代码结构问题:函数职责不单一,缺少类型提示
- 魔法值:硬编码的字符串和路径
- 代码重复:数据库连接逻辑重复
验收标准
安全性
- 消除SQL注入漏洞(使用参数化查询)
- 使用安全的密码哈希算法(bcrypt或argon2)
- 输入验证和清理
代码质量
- 符合PEP8规范
- 添加类型提示
- 函数职责单一,代码结构清晰
- 适当的注释和文档字符串
可维护性
- 消除硬编码值(使用配置或常量)
- 消除代码重复(提取公共函数)
- 改进错误处理(具体的异常类型)
性能
- 优化数据库查询(如适用)
- 资源管理正确(使用上下文管理器)
功能完整性
- 保持原有功能不变
- 所有边界条件处理正确
测试步骤
-
代码分析
- 使用工具分析legacy代码
- 记录工具识别出的问题
-
重构方案
- 使用工具生成重构方案
- 记录工具生成的重构代码
- 记录人工调整的点和原因
-
验证测试
- 运行重构后的代码
- 验证功能正确性
- 进行安全测试(如SQL注入测试)
- 记录测试结果
评估要点
问题识别能力
- 全面性:是否能识别出所有问题(安全、性能、结构等)
- 优先级:是否能正确评估问题的严重性
重构方案质量
- 正确性:重构方案是否正确且安全
- 完整性:是否解决了所有问题
- 平衡性:是否在代码质量和实用性之间取得平衡
代码质量提升
- 可读性:重构后的代码是否更易读
- 可维护性:代码结构是否更易维护
- 规范性:是否符合现代Python最佳实践
工具使用体验
- 响应速度:工具分析代码的速度
- 交互便利性:需要多少次交互才能完成重构
期望的重构方向
安全改进
# 使用参数化查询
cursor.execute("SELECT * FROM users WHERE username = ?", (username,))
# 使用安全的密码哈希
import bcrypt
password_hash = bcrypt.hashpw(password.encode(), bcrypt.gensalt()).decode()
结构改进
# 使用数据库上下文管理器
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)模式
- 添加适当的异常类型
注意:此任务评估工具在代码重构、安全修复和代码质量提升方面的综合能力。重构后的代码应该保持功能完整性的同时显著提升代码质量。