热门角色不仅是灵感来源,更是你的效率助手。通过精挑细选的角色提示词,你可以快速生成高质量内容、提升创作灵感,并找到最契合你需求的解决方案。让创作更轻松,让价值更直接!
我们根据不同用户需求,持续更新角色库,让你总能找到合适的灵感入口。
针对指定代码片段提出优化建议,提升可读性、可维护性和代码风格规范性,重点关注关键模块和特定实现方式,帮助开发者改善代码质量并符合语言最佳实践,适用于前端或多语言代码审查与重构场景。
下面是针对这段 React(JavaScript)代码的改进建议,以及一版更符合最佳实践的重构示例。重点围绕可读性、可维护性、Hooks 最佳实践、数据获取与渲染分离、精确依赖、移除副作用 mounted 标记与 var、补齐列表 key、错误/空状态处理、样式与事件统一。
改进建议
重构示例 下面给出一版更符合上述建议的实现,重点优化 useEffect 的数据加载与列表渲染部分。
import React, { useState, useEffect, useCallback, useMemo } from 'react';
export default function UserList({ api = '/api/users', onSelect }) { const [users, setUsers] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(null);
useEffect(() => { const controller = new AbortController();
const loadUsers = async () => {
setLoading(true);
setError(null);
try {
const res = await fetch(api, { signal: controller.signal });
if (!res.ok) {
throw new Error(`Request failed: ${res.status}`);
}
const json = await res.json();
if (controller.signal.aborted) return;
const normalized = Array.isArray(json)
? json.map((u, i) => ({
id: u?.id ?? String(i),
name: u?.name ?? 'N/A',
}))
: [];
setUsers(normalized);
} catch (e) {
if (e.name !== 'AbortError') {
console.error('Failed to load users:', e);
setError('加载用户数据失败,请稍后重试。');
}
} finally {
if (!controller.signal.aborted) {
setLoading(false);
}
}
};
loadUsers();
return () => controller.abort();
}, [api]);
const handleSelect = useCallback( (user) => { if (onSelect) onSelect(user); }, [onSelect] );
const itemStyle = useMemo( () => ({ padding: '4px 6px', color: loading ? 'gray' : 'black', cursor: loading ? 'not-allowed' : 'pointer', pointerEvents: loading ? 'none' : 'auto', }), [loading] );
return (
{loading && <div>loading...</div>}
{!loading && error && <div role="alert">{error}</div>}
{!loading && !error && users.length === 0 && <div>暂无用户</div>}
{!loading && !error && users.length > 0 && (
<ul>
{users.map((u) => (
<li key={u.id} style={itemStyle} onClick={() => handleSelect(u)}>
{u.name}
</li>
))}
</ul>
)}
{/* TODO: add search */}
</div>
); }
针对关键模块的具体优化说明
可选进一步优化
改进建议概览
推荐实现(拆分 I/O 与纯函数,保留统计信息) from future import annotations
import csv import json import logging from dataclasses import dataclass from pathlib import Path from typing import Any, Dict, Iterable, List, Mapping, Optional
logger = logging.getLogger(name)
@dataclass(frozen=True) class UserRecord: """统一的数据结构,提升类型安全与可维护性。""" id: str name: str active: bool
@dataclass(frozen=True) class MergeResult: """返回合并结果与统计信息,测试更友好。""" records: List[UserRecord] processed: int matched: int skipped_ids: List[str]
def parse_bool(value: Any, default: bool = False) -> bool: """将多种形式的真值/假值规范为 bool。""" if isinstance(value, bool): return value if isinstance(value, str): s = value.strip().lower() if s in {"true", "1", "yes", "y", "t"}: return True if s in {"false", "0", "no", "n", "f", ""}: return False return default if isinstance(value, (int, float)): return bool(value) return default
def merge_records( ids: Iterable[str], index: Mapping[str, Mapping[str, Any]] ) -> MergeResult: """ 纯函数:将 CSV 中的 id 列与 JSON 索引合并为统一记录。 - 不进行 I/O、无副作用。 - 保留统计信息,便于测试。 """ records: List[UserRecord] = [] skipped: List[str] = [] processed = 0 matched = 0
for raw_id in ids:
processed += 1
item_id = str(raw_id).strip()
if not item_id:
skipped.append(item_id)
continue
found = index.get(item_id)
if found is None:
skipped.append(item_id)
continue
records.append(
UserRecord(
id=item_id,
name=str(found.get("name", "")),
active=parse_bool(found.get("active", False)),
)
)
matched += 1
return MergeResult(records=records, processed=processed, matched=matched, skipped_ids=skipped)
def load_ids_from_csv(csv_path: Path) -> List[str]: """ I/O 函数:从 CSV 读取第一列 id。 使用 csv 模块以避免手工 split 的边界问题(逗号、引号、空格等)。 """ ids: List[str] = [] with csv_path.open(newline="", encoding="utf-8") as f: reader = csv.reader(f) for row in reader: if not row: continue ids.append(row[0].strip()) return ids
def load_json_index(json_path: Path) -> Dict[str, Dict[str, Any]]: """ I/O 函数:读取 JSON 列表并用 id 建立索引,便于 O(1) 检索。 """ with json_path.open(encoding="utf-8") as f: data = json.load(f)
if not isinstance(data, list):
raise ValueError("JSON root must be a list of objects")
index: Dict[str, Dict[str, Any]] = {}
for obj in data:
if not isinstance(obj, dict):
continue
key = str(obj.get("id", "")).strip()
if key:
index[key] = obj
return index
def read_and_merge(csv_path: str | Path, json_path: str | Path) -> MergeResult: """ 编排函数:进行 I/O 并调用纯函数合并。 - 细化异常并使用 logging。 - 保持返回类型一致,异常时返回空结果。 """ csv_path = Path(csv_path) json_path = Path(json_path)
try:
ids = load_ids_from_csv(csv_path)
index = load_json_index(json_path)
except FileNotFoundError as exc:
logger.error("File not found: %s", exc.filename)
return MergeResult(records=[], processed=0, matched=0, skipped_ids=[])
except json.JSONDecodeError as exc:
logger.error("Invalid JSON: %s", exc)
return MergeResult(records=[], processed=0, matched=0, skipped_ids=[])
except UnicodeDecodeError as exc:
logger.error("Encoding error: %s", exc)
return MergeResult(records=[], processed=0, matched=0, skipped_ids=[])
except ValueError as exc:
logger.error("Data format error: %s", exc)
return MergeResult(records=[], processed=0, matched=0, skipped_ids=[])
return merge_records(ids, index)
def records_to_dicts(records: Iterable[UserRecord]) -> List[Dict[str, Any]]: """ 如果需要与原有 dict 格式兼容(例如对外 API),可将 dataclass 转回字典。 """ return [{"id": r.id, "name": r.name, "active": r.active} for r in records]
if name == "main": logging.basicConfig(level=logging.INFO) result = read_and_merge("data/users.csv", "data/users.json") # 保持输出简单,同时兼容原来的打印 print(records_to_dicts(result.records)) print({"processed": result.processed, "matched": result.matched, "skipped_ids": result.skipped_ids})
关键优化点详解
如需尽量保持原返回结构
下面是针对现有代码的审查与改进建议,重点围绕 Go 语言惯例、健壮性、可维护性以及模块边界进行优化,并给出更符合习惯的实现示例(包含接口抽象存储、仅允许 POST/PUT、使用 json.Decoder + 结构体安全解码、字段校验、完善错误处理与响应)。
主要问题与改进点
更符合 Go 惯例的实现示例 说明:存储层将原始 JSON 字节按 id 缓存;处理器只接收 POST/PUT,校验 Content-Type 和 JSON,统一返回 JSON。
package main
import ( "bytes" "context" "encoding/json" "io" "net/http" "strings" "sync" "time" )
type Store interface { Save(ctx context.Context, id string, raw []byte) error }
type MemoryStore struct { mu sync.RWMutex data map[string][]byte }
func NewMemoryStore() *MemoryStore { return &MemoryStore{ data: make(map[string][]byte), } }
func (m *MemoryStore) Save(ctx context.Context, id string, raw []byte) error { m.mu.Lock() defer m.mu.Unlock() // 拷贝一份,避免调用方后续修改 slice m.data[id] = append([]byte(nil), raw...) return nil }
type Server struct { store Store }
type SaveRequest struct {
ID string json:"id"
}
func (s *Server) Save(w http.ResponseWriter, r *http.Request) { if r.Method != http.MethodPost && r.Method != http.MethodPut { w.Header().Set("Allow", "POST, PUT") http.Error(w, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed) return } defer r.Body.Close()
ct := r.Header.Get("Content-Type")
if ct == "" || !strings.Contains(ct, "application/json") {
http.Error(w, http.StatusText(http.StatusUnsupportedMediaType), http.StatusUnsupportedMediaType)
return
}
// 限制请求体大小:1MB,可按需调整
r.Body = http.MaxBytesReader(w, r.Body, 1<<20)
// 读取原始字节用于存储
raw, err := io.ReadAll(r.Body)
if err != nil {
http.Error(w, "failed to read request body", http.StatusBadRequest)
return
}
// 用 Decoder + 结构体解析;可选择开启 DisallowUnknownFields
var req SaveRequest
dec := json.NewDecoder(bytes.NewReader(raw))
dec.DisallowUnknownFields()
if err := dec.Decode(&req); err != nil {
http.Error(w, "invalid JSON: "+err.Error(), http.StatusBadRequest)
return
}
if strings.TrimSpace(req.ID) == "" {
http.Error(w, "id is required", http.StatusBadRequest)
return
}
if err := s.store.Save(r.Context(), req.ID, raw); err != nil {
http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError)
return
}
writeJSON(w, http.StatusOK, map[string]any{
"ok": true,
"id": req.ID,
})
}
func writeJSON(w http.ResponseWriter, status int, v any) { w.Header().Set("Content-Type", "application/json") w.WriteHeader(status) _ = json.NewEncoder(w).Encode(v) }
func main() { srv := &Server{store: NewMemoryStore()}
mux := http.NewServeMux()
mux.HandleFunc("/save", srv.Save)
server := &http.Server{
Addr: ":8080",
Handler: mux,
ReadTimeout: 5 * time.Second,
ReadHeaderTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
IdleTimeout: 60 * time.Second,
}
if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
panic(err)
}
}
补充说明与可选增强
通过专家化代码审查,帮助开发者提升代码的可读性、可维护性,以及更符合编程语言习惯,最终提升开发效率与代码质量。
帮助入门开发者快速提升代码可读性,并学习编程语言的最佳实践技巧,让写出的代码更专业。
帮助技术管理人员审查团队代码,确保提交的代码符合规范,提高运维效率与项目整体质量。
协助资深开发者优化复杂代码逻辑,提升整体性能表现,并加速任务迭代效率。
将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。
把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。
在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。
免费获取高级提示词-优惠即将到期