热门角色不仅是灵感来源,更是你的效率助手。通过精挑细选的角色提示词,你可以快速生成高质量内容、提升创作灵感,并找到最契合你需求的解决方案。让创作更轻松,让价值更直接!
我们根据不同用户需求,持续更新角色库,让你总能找到合适的灵感入口。
该提示词帮助开发者或团队对现有代码进行全面审查,提供结构优化、性能提升、可读性增强和安全性改进建议。结合重构技巧、最佳实践和主流编码规范,确保代码高效、整洁且易维护,同时降低潜在漏洞和资源浪费风险。
以下是对现有代码的审查、问题诊断与重构建议,重点覆盖性能、可读性、异常处理、测试覆盖与资源使用。同时提供一版可直接替换的重构示例代码。
主要问题与优化点
建议的重构版本(替换 data_cleanup.py) 注意:本版本将输出改为真正的去重结果(每个邮箱保留最高分),消除了原始代码输出重复项的行为差异。如果需要保留原始行为,可在建议中说明。
import csv import json import logging from dataclasses import dataclass, asdict from pathlib import Path from typing import Iterator, List, Dict, Any
DATA_PATH = Path('data/input.csv') OUTPUT_PATH = Path('data/output.json')
@dataclass(frozen=True) class Record: id: int name: str email: str score: float
def setup_logging(level: int = logging.INFO) -> None: logging.basicConfig(level=level, format='%(levelname)s: %(message)s')
def normalize_email(email: str) -> str: # 去除所有空白并小写;避免重复正则 if not email: return '' return ''.join(email.split()).lower()
def safe_int(value: Any, default: int = 0) -> int: try: return int(value) except (TypeError, ValueError): return default
def safe_float(value: Any, default: float = 0.0) -> float: try: return float(value) except (TypeError, ValueError): return default
def load_data(path: Path = DATA_PATH) -> Iterator[List[str]]: """ 流式读取CSV,跳过空行。 """ with path.open('r', encoding='utf-8', newline='') as f: reader = csv.reader(f) for row in reader: # 跳过完全为空的行 if not row or all(not str(cell).strip() for cell in row): continue yield row
def process(rows: Iterator[List[str]]) -> List[Dict[str, Any]]: """ 去重策略:以邮箱为键,保留 score 最大的记录。 返回值为去重后的字典列表(适合直接导出为JSON)。 """ dedup: Dict[str, Record] = {} skipped = 0 total = 0
for total, r in enumerate(rows, 1):
if len(r) < 4:
skipped += 1
logging.warning('Skipping row %s: expected 4 columns, got %s', total, len(r))
continue
rec = Record(
id=safe_int(r[0]),
name=(r[1] or '').strip(),
email=normalize_email(r[2]),
score=safe_float(r[3])
)
if not rec.email or '@' not in rec.email:
skipped += 1
logging.warning('Skipping row %s: invalid email "%s"', total, rec.email)
continue
prev = dedup.get(rec.email)
if prev is None or rec.score > prev.score:
dedup[rec.email] = rec
logging.info('Processed rows: %s, skipped: %s, unique emails: %s', total, skipped, len(dedup))
return [asdict(r) for r in dedup.values()]
def export_json(data: List[Dict[str, Any]], out_path: Path = OUTPUT_PATH) -> None: """ 直接通过json.dump写出,避免字符串拼接。 """ out_path.parent.mkdir(parents=True, exist_ok=True) with out_path.open('w', encoding='utf-8') as f: json.dump(data, f, ensure_ascii=False, separators=(',', ':'))
def export_ndjson(data: List[Dict[str, Any]], out_path: Path = Path('data/output.ndjson')) -> None: """ 按行写出(NDJSON),便于流式处理超大数据。 """ out_path.parent.mkdir(parents=True, exist_ok=True) with out_path.open('w', encoding='utf-8') as f: for item in data: f.write(json.dumps(item, ensure_ascii=False) + '\n')
def main() -> None: setup_logging() try: rows = load_data() processed = process(rows) export_json(processed) logging.info('done %s', len(processed)) except FileNotFoundError: logging.error('Input file not found: %s', DATA_PATH) except PermissionError as e: logging.error('Permission error: %s', e) except Exception as e: logging.exception('Unexpected error: %s', e)
if name == 'main': main()
进一步建议与实践
测试覆盖建议(示例用例)
如果你希望保留原函数签名行为(例如返回全部行而非去重结果),或需要命令行支持、NDJSON默认输出、邮箱更严格校验等,我可以据此再微调版本。
审查结果摘要
重构建议与最佳实践(按优化侧重点)
参考实现 server.js(精简示例,展示关键点) /* server.js */ const express = require('express'); const mysql = require('mysql2/promise'); const fs = require('fs/promises'); const path = require('path'); const helmet = require('helmet'); const compression = require('compression'); const rateLimit = require('express-rate-limit'); const cors = require('cors'); const { body, validationResult } = require('express-validator'); const he = require('he'); const morgan = require('morgan'); require('dotenv').config();
const app = express();
// Security, performance middlewares app.use(helmet()); app.use(compression()); app.use(cors({ origin: process.env.CORS_ORIGIN || 'https://your-frontend.example', methods: ['GET', 'POST'] })); app.use(express.json({ limit: '100kb' })); app.use(morgan(process.env.NODE_ENV === 'production' ? 'combined' : 'dev')); app.set('trust proxy', 1); const limiter = rateLimit({ windowMs: 60 * 1000, max: 100 }); app.use(limiter);
// DB pool const pool = mysql.createPool({ host: process.env.DB_HOST || 'localhost', user: process.env.DB_USER || 'root', password: process.env.DB_PASS || 'root', database: process.env.DB_NAME || 'appdb', waitForConnections: true, connectionLimit: parseInt(process.env.DB_POOL_SIZE || '10', 10), queueLimit: 0 });
// Preload template once (non-blocking per request) let headerTemplate = ''; async function loadTemplate() { const file = path.join(__dirname, 'templates', 'header.html'); headerTemplate = await fs.readFile(file, 'utf8'); } loadTemplate().catch((err) => { console.error('Failed to load template:', err); process.exit(1); });
// Simple in-memory TTL cache for reports const cache = new Map(); function cacheGet(key) { const entry = cache.get(key); if (!entry) return null; if (Date.now() > entry.expires) { cache.delete(key); return null; } return entry.value; } function cacheSet(key, value, ttlMs) { cache.set(key, { value, expires: Date.now() + ttlMs }); }
// Async handler wrapper function asyncHandler(fn) { return (req, res, next) => Promise.resolve(fn(req, res, next)).catch(next); }
// Validate input; consider switching to GET /users/search?q=...
app.post(
'/users/search',
[body('query').optional().isString().isLength({ min: 0, max: 100 }).trim()],
asyncHandler(async (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
const q = req.body.query || '';
// Parameterized LIKE to prevent SQL injection
const like = %${q}%;
const [rows] = await pool.execute(
'SELECT id, name, email FROM users WHERE name LIKE ? ORDER BY name ASC LIMIT 100',
[like]
);
// Escape to prevent XSS if returning HTML
let html = headerTemplate;
for (const row of rows) {
html += `<div>${he.encode(row.name)} - ${he.encode(row.email)}</div>`;
}
res.set('Content-Type', 'text/html; charset=utf-8');
res.send(html);
}) );
app.get( '/reports/summary', asyncHandler(async (req, res) => { const cached = cacheGet('reports.summary'); if (cached) { return res.json(cached); }
// Efficient aggregation in DB
const [rows] = await pool.execute('SELECT type, COUNT(*) AS count FROM events GROUP BY type');
const byType = {};
let total = 0;
for (const r of rows) {
byType[r.type] = Number(r.count);
total += Number(r.count);
}
const payload = { total, byType };
// Server-side cache for 30s; tune TTL per business needs
cacheSet('reports.summary', payload, 30_000);
// Client-side caching strategy can vary; here we disable client cache
res.set('Cache-Control', 'no-store');
res.json(payload);
}) );
// Health check app.get('/health', (req, res) => res.json({ status: 'ok' }));
// Centralized error handler app.use((err, req, res, next) => { console.error('Unhandled error:', { message: err.message, stack: err.stack }); res.status(err.status || 500).json({ error: 'Internal Server Error' }); });
// Graceful shutdown
const port = parseInt(process.env.PORT || '3000', 10);
const server = app.listen(port, () => console.log(server started on ${port}));
async function shutdown() {
console.log('Shutting down...');
server.close(async () => {
try {
await pool.end();
} catch (e) {
console.error('Error closing DB pool:', e);
}
process.exit(0);
});
}
process.on('SIGINT', shutdown);
process.on('SIGTERM', shutdown);
数据库与索引建议
组织结构建议
质量与交付保障
额外建议
以上改造能在安全性、性能、模块化、可维护性、代码风格、兼容性和并发效率各维度显著提升质量,同时保持代码清晰统一、易于演进。
下面是针对你的模块的审查与优化建议,重点覆盖并发效率、可扩展性、可维护性、可读性、资源使用与异常处理,并给出一个可落地的重构示例。
主要问题与改进方向
重构思路与最佳实践
参考重构示例(简化版) 说明:不引入外部依赖,使用 java.util.concurrent 与 java.util.logging。实际项目可替换为 slf4j。
import java.util.concurrent.*; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger;
public final class TaskProcessor implements AutoCloseable {
private static final Logger LOG = Logger.getLogger(TaskProcessor.class.getName());
private static final int DEFAULT_CAPACITY = 10_000;
private final BlockingQueue<String> queue;
private final ExecutorService executor;
private final AtomicBoolean running = new AtomicBoolean(false);
private final int workers;
private static final AtomicInteger WORKER_ID = new AtomicInteger();
public TaskProcessor() {
this(DEFAULT_CAPACITY, Runtime.getRuntime().availableProcessors());
}
public TaskProcessor(int capacity, int workers) {
if (capacity <= 0) throw new IllegalArgumentException("capacity must be > 0");
if (workers <= 0) throw new IllegalArgumentException("workers must be > 0");
this.queue = new LinkedBlockingQueue<>(capacity);
this.workers = workers;
this.executor = Executors.newFixedThreadPool(workers, r -> {
Thread t = new Thread(r, "task-worker-" + WORKER_ID.incrementAndGet());
t.setDaemon(true);
return t;
});
}
// 非阻塞提交;如需阻塞提交,可用 offer(t, timeout, unit) 或 put(t)
public boolean addTask(String t) {
if (t == null || t.isEmpty()) return false;
// 简单输入长度保护,防止超长 payload
if (t.length() > 10_000) {
LOG.warning("Task too long, rejected");
return false;
}
return queue.offer(t);
}
public void start() {
if (!running.compareAndSet(false, true)) {
LOG.fine("TaskProcessor already running");
return;
}
for (int i = 0; i < workers; i++) {
executor.submit(this::workerLoop);
}
}
private void workerLoop() {
while (running.get() || !queue.isEmpty()) {
try {
// 等待新任务,避免空转;停止后允许 drain 剩余任务
String raw = queue.poll(200, TimeUnit.MILLISECONDS);
if (raw == null) continue;
process(raw);
} catch (InterruptedException ie) {
Thread.currentThread().interrupt();
break;
} catch (Exception e) {
LOG.log(Level.WARNING, "Task processing failed", e);
}
}
}
private void process(String raw) {
// 高效解析:indexOf + substring
int idx = raw.indexOf(':');
String id = (idx >= 0) ? raw.substring(0, idx) : raw;
String payload = (idx >= 0 && idx + 1 < raw.length()) ? raw.substring(idx + 1) : "";
// 基本净化,避免日志注入与脏数据
payload = sanitize(payload);
if ("debug".equals(id)) {
LOG.fine("payload=" + payload);
}
// 真正的工作逻辑;移除无意义的 CPU 计算
// TODO: 按需实现实际处理。如下示例限速:
// try { TimeUnit.MILLISECONDS.sleep(5); } catch (InterruptedException ie) { Thread.currentThread().interrupt(); }
}
private String sanitize(String s) {
// 去除控制字符与 CR/LF/Tab,避免日志污染
return s.replaceAll("[\\p{Cntrl}&&[^\n\t]]", "").replace('\n', ' ').replace('\r', ' ').replace('\t', ' ');
}
public void stop() {
if (!running.compareAndSet(true, false)) {
LOG.fine("TaskProcessor not running");
}
shutdownExecutor();
}
private void shutdownExecutor() {
executor.shutdown();
try {
if (!executor.awaitTermination(5, TimeUnit.SECONDS)) {
executor.shutdownNow();
}
} catch (InterruptedException ie) {
executor.shutdownNow();
Thread.currentThread().interrupt();
}
}
@Override
public void close() {
stop();
}
public static void main(String[] args) throws Exception {
TaskProcessor tp = new TaskProcessor();
tp.start();
tp.addTask("1:data");
tp.addTask("2:more");
TimeUnit.MILLISECONDS.sleep(100);
tp.stop();
}
}
进一步增强建议
采用上述重构与实践后,你将获得:
借助提示词轻松优化复杂后端逻辑,让API层次结构清晰、性能更高,开发效率显著提升。
通过系统化的改进建议,学习代码优化的最佳实践,快速掌握标准化编程技巧。
帮助审查团队代码质量,制定更高效的开发规范与优化策略,推动项目高效交付。
帮助开发者快速优化代码结构,提升代码性能、可读性以及可维护性,从而大幅提高开发效率并减少潜在的安全问题或性能瓶颈的风险。
将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。
把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。
在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。
免费获取高级提示词-优惠即将到期