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

6.1 KiB
Raw Blame History

Task 3: Legacy代码重构复杂任务

任务描述

给定一段Python legacy代码使用AI工具辅助重构要求

  1. 提升代码可读性
  2. 修复潜在的安全漏洞
  3. 优化性能和结构
  4. 添加适当的错误处理
  5. 符合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()

代码问题分析

  1. SQL注入漏洞使用字符串拼接构造SQL查询
  2. 不安全的密码哈希使用MD5已不安全
  3. 硬编码路径/data/users/硬编码
  4. 资源泄漏:数据库连接可能未正确关闭
  5. 错误处理不充分:异常处理过于宽泛
  6. 代码结构问题:函数职责不单一,缺少类型提示
  7. 魔法值:硬编码的字符串和路径
  8. 代码重复:数据库连接逻辑重复

验收标准

安全性

  • 消除SQL注入漏洞使用参数化查询
  • 使用安全的密码哈希算法bcrypt或argon2
  • 输入验证和清理

代码质量

  • 符合PEP8规范
  • 添加类型提示
  • 函数职责单一,代码结构清晰
  • 适当的注释和文档字符串

可维护性

  • 消除硬编码值(使用配置或常量)
  • 消除代码重复(提取公共函数)
  • 改进错误处理(具体的异常类型)

性能

  • 优化数据库查询(如适用)
  • 资源管理正确(使用上下文管理器)

功能完整性

  • 保持原有功能不变
  • 所有边界条件处理正确

测试步骤

  1. 代码分析

    • 使用工具分析legacy代码
    • 记录工具识别出的问题
  2. 重构方案

    • 使用工具生成重构方案
    • 记录工具生成的重构代码
    • 记录人工调整的点和原因
  3. 验证测试

    • 运行重构后的代码
    • 验证功能正确性
    • 进行安全测试如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模式
  • 添加适当的异常类型

注意:此任务评估工具在代码重构、安全修复和代码质量提升方面的综合能力。重构后的代码应该保持功能完整性的同时显著提升代码质量。