热门角色不仅是灵感来源,更是你的效率助手。通过精挑细选的角色提示词,你可以快速生成高质量内容、提升创作灵感,并找到最契合你需求的解决方案。让创作更轻松,让价值更直接!
我们根据不同用户需求,持续更新角色库,让你总能找到合适的灵感入口。
一键智能重构代码,更规范、更高效,轻松提升代码质量!
重构说明
目标达成
主要问题与修复
针对关键模块/方法
重构后的代码(符合 ESLint) import React, { useState, useEffect, useCallback } from 'react';
// 可测试的纯 API 方法
export async function searchApi(query, options = {}) {
const url = /api/search?q=${encodeURIComponent(query)};
const res = await fetch(url, options);
if (!res.ok) {
throw new Error(Request failed with status ${res.status});
}
const data = await res.json();
return Array.isArray(data?.data) ? data.data : [];
}
// 通用的去抖 Hook function useDebounce(value, delay = 300) { const [debouncedValue, setDebouncedValue] = useState(value);
useEffect(() => { const id = setTimeout(() => setDebouncedValue(value), delay); return () => clearTimeout(id); }, [value, delay]);
return debouncedValue; }
export default function SearchForm() { const [keyword, setKeyword] = useState(''); const [items, setItems] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null);
// 去抖后的查询关键字(使用 trim 避免空格触发请求) const debouncedKeyword = useDebounce(keyword.trim(), 300);
// 统一的搜索执行函数,便于复用与测试 const performSearch = useCallback( async (query, signal) => { setLoading(true); try { const result = await searchApi(query, { signal }); setItems(result); setError(null); } catch (err) { // 取消请求不认为是错误 if (err?.name !== 'AbortError') { setError(err?.message || '搜索失败,请稍后重试'); } } finally { setLoading(false); } }, [] );
// 自动搜索:监听去抖后的关键字变化 useEffect(() => { if (!debouncedKeyword) { setItems([]); return; } const controller = new AbortController(); void performSearch(debouncedKeyword, controller.signal); return () => controller.abort(); }, [debouncedKeyword, performSearch]);
// 原 onChange 逻辑重构:仅更新输入值 const handleChange = useCallback((e) => { setKeyword(e.target.value); }, []);
// 原 reload 重构:复用统一搜索方法 const handleReload = useCallback(() => { const query = keyword.trim(); if (!query) return; void performSearch(query); }, [keyword, performSearch]);
const showPrompt = !keyword.trim() && !loading; const getItemKey = (item, index) => item?.id ?? item?.name ?? String(index);
return (
{showPrompt && <span>请输入关键字</span>}
{error && <p role="alert">错误:{error}</p>}
{loading ? (
<p>加载中...</p>
) : (
<ul>
{items.map((i, idx) => (
<li key={getItemKey(i, idx)}>{i?.name ?? '-'}</li>
))}
</ul>
)}
</div>
); }
测试建议
重构后的代码(report.py)
from future import annotations
import csv import heapq import json import logging from dataclasses import dataclass from pathlib import Path from typing import Iterable, List, Optional, Sequence
logging.basicConfig(level=logging.INFO) logger = logging.getLogger(name)
@dataclass(frozen=True) class Item: """结构化的数据项,提升类型安全与可读性。""" id: str name: str score: float
@dataclass class ReportConfig: """报告生成配置。threshold 预留(当前逻辑未使用)。""" limit: int = 1000 threshold: float = 0.7
def load_data(csv_path: str | Path, json_path: str | Path) -> List[Item]: """ 从 CSV 和 JSON 文件加载数据。 - CSV 每行格式: id,name,score - JSON 为对象列表,支持键: id, n(name), s(score) - 对异常行进行忽略并记录日志 """ items: List[Item] = []
# 读取 CSV
csv_path = Path(csv_path)
if csv_path.exists():
with csv_path.open("r", encoding="utf-8", newline="") as f:
reader = csv.reader(f)
for row_num, row in enumerate(reader, start=1):
if not row or len(row) < 3:
logger.debug("Skip CSV row %d: insufficient columns", row_num)
continue
raw_id, raw_name, raw_score = row[0], row[1], row[2]
try:
score = float(raw_score)
except ValueError:
logger.debug("Skip CSV row %d: invalid score '%s'", row_num, raw_score)
continue
items.append(Item(id=str(raw_id).strip(),
name=str(raw_name),
score=score))
else:
logger.warning("CSV file not found: %s", csv_path)
# 读取 JSON
json_path = Path(json_path)
if json_path.exists():
with json_path.open("r", encoding="utf-8") as f:
try:
raw_list = json.load(f)
except json.JSONDecodeError as exc:
logger.error("Invalid JSON file '%s': %s", json_path, exc)
raw_list = []
if isinstance(raw_list, list):
for idx, obj in enumerate(raw_list, start=1):
if not isinstance(obj, dict):
logger.debug("Skip JSON item %d: not a dict", idx)
continue
raw_id = obj.get("id")
raw_name = obj.get("n", "")
raw_score = obj.get("s", 0)
try:
score = float(raw_score)
except (TypeError, ValueError):
logger.debug("Skip JSON item %d: invalid score '%s'", idx, raw_score)
continue
items.append(Item(id=str(raw_id).strip(),
name=str(raw_name),
score=score))
else:
logger.warning("JSON root is not a list: %s", json_path)
else:
logger.warning("JSON file not found: %s", json_path)
return items
def normalize(items: Iterable[Item]) -> List[Item]: """ 规范化数据: - name 去空格并转为小写 - score 若 > 1 则按百分比缩放为 /100 - 保持按规范化后的 name 去重(与原代码语义保持一致,且 O(n)) """ normalized: List[Item] = [] seen_names: set[str] = set()
for item in items:
normalized_name = item.name.strip().lower()
normalized_score = item.score / 100.0 if item.score > 1 else item.score
if normalized_name in seen_names:
continue
seen_names.add(normalized_name)
normalized.append(Item(id=item.id, name=normalized_name, score=normalized_score))
return normalized
def dedup_and_sort(items: Sequence[Item], limit: int, cache: Optional[List[str]] = None) -> List[Item]: """ 去重并选出 Top-K: - 按 id 或 name 去重(任一重复则跳过) - 使用最小堆进行 Top-K 选择,复杂度 O(n log k),提升性能 - 结果按 score 降序;同分数时按出现顺序稳定 - 可选收集去重后的 id 到 cache(不再使用全局变量) """ seen_ids: set[str] = set() seen_names: set[str] = set()
# 堆中元素为 (score, order, Item),最小堆保留当前前 K 项
heap: List[tuple[float, int, Item]] = []
for order, item in enumerate(items):
if item.id in seen_ids or item.name in seen_names:
continue
seen_ids.add(item.id)
seen_names.add(item.name)
if cache is not None:
cache.append(item.id)
score = item.score
if len(heap) < limit:
heapq.heappush(heap, (score, order, item))
else:
# 比堆顶更优则替换(更高分或更早出现)
top_score, top_order, _ = heap[0]
if score > top_score or (score == top_score and order < top_order):
heapq.heapreplace(heap, (score, order, item))
# 将堆内容转为按 score 降序、order 升序的列表
heap.sort(key=lambda t: (-t[0], t[1]))
return [t[2] for t in heap]
def main() -> None: config = ReportConfig() ids_cache: List[str] = []
data = load_data("data.csv", "more.json")
data = normalize(data)
rows = dedup_and_sort(data, limit=config.limit, cache=ids_cache)
for r in rows:
print(f"{r.id},{r.name},{r.score}")
if name == "main": main()
重构说明
性能优化
可维护性增强
可读性提升
可测试性提高
行为保持与差异说明
其他
以下为重构后的代码与说明。重构重点:
代码
文件:app/domain/CustomerType.java package app.domain;
public enum CustomerType { VIP, NEW, STAFF, REGULAR;
public static CustomerType fromNullable(String type) { if (type == null) { return REGULAR; } switch (type.trim().toUpperCase()) { case "VIP": return VIP; case "NEW": return NEW; case "STAFF": return STAFF; default: return REGULAR; } } }
文件:app/discount/DiscountStrategy.java package app.discount;
public interface DiscountStrategy { double calculate(double amount); }
文件:app/discount/VipDiscountStrategy.java package app.discount;
public final class VipDiscountStrategy implements DiscountStrategy { private static final double BASE_RATE = 0.10; private static final double HIGH_RATE = 0.15; private static final double THRESHOLD = 1000.0;
@Override public double calculate(double amount) { if (amount <= 0.0) { return 0.0; } return amount * (amount > THRESHOLD ? HIGH_RATE : BASE_RATE); } }
文件:app/discount/NewUserDiscountStrategy.java package app.discount;
public final class NewUserDiscountStrategy implements DiscountStrategy { private static final double WELCOME_CASH = 20.0;
@Override public double calculate(double amount) { return WELCOME_CASH; } }
文件:app/discount/StaffDiscountStrategy.java package app.discount;
public final class StaffDiscountStrategy implements DiscountStrategy { private static final double RATE = 0.30;
@Override public double calculate(double amount) { if (amount <= 0.0) { return 0.0; } return amount * RATE; } }
文件:app/discount/NoDiscountStrategy.java package app.discount;
public final class NoDiscountStrategy implements DiscountStrategy { @Override public double calculate(double amount) { return 0.0; } }
文件:app/discount/DiscountStrategyFactory.java package app.discount;
import app.domain.CustomerType;
public final class DiscountStrategyFactory { private static final DiscountStrategy VIP = new VipDiscountStrategy(); private static final DiscountStrategy NEW_USER = new NewUserDiscountStrategy(); private static final DiscountStrategy STAFF = new StaffDiscountStrategy(); private static final DiscountStrategy NONE = new NoDiscountStrategy();
private DiscountStrategyFactory() {}
public static DiscountStrategy of(CustomerType type) { switch (type) { case VIP: return VIP; case NEW: return NEW_USER; case STAFF: return STAFF; case REGULAR: default: return NONE; } } }
文件:app/repository/OrderRepository.java package app.repository;
import java.sql.SQLException;
public interface OrderRepository { void save(String userId, String productId, int qty) throws SQLException;
int countByUserId(String userId) throws SQLException; }
文件:app/repository/JdbcOrderRepository.java package app.repository;
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException;
public final class JdbcOrderRepository implements OrderRepository { private static final String SQL_INSERT = "INSERT INTO orders(user_id, product_id, qty) VALUES(?, ?, ?)"; private static final String SQL_COUNT_BY_USER = "SELECT COUNT(*) AS n FROM orders WHERE user_id = ?";
private final Connection connection;
public JdbcOrderRepository(Connection connection) { this.connection = connection; }
@Override public void save(String userId, String productId, int qty) throws SQLException { try (PreparedStatement ps = connection.prepareStatement(SQL_INSERT)) { ps.setString(1, userId); ps.setString(2, productId); ps.setInt(3, qty); ps.executeUpdate(); } }
@Override public int countByUserId(String userId) throws SQLException { try (PreparedStatement ps = connection.prepareStatement(SQL_COUNT_BY_USER)) { ps.setString(1, userId); try (ResultSet rs = ps.executeQuery()) { if (rs.next()) { return rs.getInt("n"); } return 0; } } } }
文件:app/service/OrderService.java package app.service;
import app.discount.DiscountStrategy; import app.discount.DiscountStrategyFactory; import app.domain.CustomerType; import app.repository.JdbcOrderRepository; import app.repository.OrderRepository; import java.sql.Connection; import java.sql.SQLException; import java.util.List;
public final class OrderService { private static final String STATUS_INVALID = "INVALID"; private static final String STATUS_OK_PREFIX = "OK:"; private static final String STATUS_ERR_PREFIX = "ERR:"; private static final String SUMMARY_SEPARATOR = "|"; private static final String SUMMARY_KV_SEPARATOR = ":";
private static final CustomerType SUMMARY_DEFAULT_TYPE = CustomerType.VIP; private static final double SUMMARY_DEFAULT_AMOUNT = 120.0;
private final OrderRepository orderRepository;
// 推荐:依赖注入仓储以提升可测试性 public OrderService(OrderRepository orderRepository) { this.orderRepository = orderRepository; }
// 兼容原构造方式:从 Connection 创建 JDBC 仓储 public OrderService(Connection connection) { this.orderRepository = new JdbcOrderRepository(connection); }
// 策略模式:根据类型委派到对应策略 public double calcDiscount(String type, double amount) { CustomerType customerType = CustomerType.fromNullable(type); DiscountStrategy strategy = DiscountStrategyFactory.of(customerType); return strategy.calculate(amount); }
// 校验与持久化解耦到仓储;使用 PreparedStatement 防注入 public String saveOrder(String userId, String productId, int qty) { if (isBlank(userId) || isBlank(productId) || qty <= 0) { return STATUS_INVALID; } try { orderRepository.save(userId, productId, qty); int count = orderRepository.countByUserId(userId); return STATUS_OK_PREFIX + count; } catch (SQLException ex) { return STATUS_ERR_PREFIX + ex.getMessage(); } }
// 渲染职责保留在服务层但使用 StringBuilder 提升性能
public String summary(List
private static boolean isBlank(String s) { return s == null || s.trim().isEmpty(); } }
重构说明
遵循设计模式
可维护性增强
性能优化
编码规范(Google Java Style)
兼容性与扩展建议
针对 智能进行代码重构,满足特定目标与规范 的日常工作场景,该工具旨在解决以下问题:
工具名称: 代码重构助手
功能简介: 智能分析现有代码结构,提供符合最佳实践的重构方案,提升代码质量、可读性和性能,确保符合团队编码规范。
从代码审查到重构完成的完整质量保障流程,确保代码质量和团队协作效率。
通过提示词帮助自动优化代码结构,减少重复劳动,提升代码性能与稳定性,专注解决核心技术问题。
帮助快速完成代码审核与重构工作,确保团队代码统一性,推进高质量架构落地。
可以快速学习最佳代码实践,轻松优化项目代码,提升编程能力并减少低效尝试。
将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。
把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。
在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。
免费获取高级提示词-优惠即将到期