热门角色不仅是灵感来源,更是你的效率助手。通过精挑细选的角色提示词,你可以快速生成高质量内容、提升创作灵感,并找到最契合你需求的解决方案。让创作更轻松,让价值更直接!
我们根据不同用户需求,持续更新角色库,让你总能找到合适的灵感入口。
一键优化代码结构,升级现代写法,标注改进收益,让代码更规范、更易维护!
下面给出基于 Django 的重构版本,并逐条标注改动与收益。示例使用类视图(CBV)、Django ORM、分页、JSON/CSV 双输出、类型标注、结构化日志与异常处理等现代特性。
from typing import Iterable, Iterator, List, Dict import logging import csv import io from pathlib import Path
from django.contrib.auth import get_user_model from django.core.paginator import Paginator, EmptyPage from django.http import JsonResponse, StreamingHttpResponse, HttpRequest, HttpResponse from django.views import View
logger = logging.getLogger(name)
def compute(x: Iterable[int]) -> int: return sum(x)
class UserListView(View): default_page_size: int = 20 max_page_size: int = 100
def get(self, request: HttpRequest) -> HttpResponse:
fmt = (request.GET.get('format') or 'json').lower()
page_str = request.GET.get('page', '1')
per_page_str = request.GET.get('per_page', str(self.default_page_size))
# 参数校验与默认值处理
try:
page = max(1, int(page_str))
except ValueError:
return JsonResponse({'error': 'Invalid page parameter'}, status=400)
try:
per_page = max(1, int(per_page_str))
per_page = min(per_page, self.max_page_size)
except ValueError:
per_page = self.default_page_size
if fmt not in {'json', 'csv'}:
return JsonResponse({'error': 'Invalid format parameter'}, status=400)
try:
User = get_user_model()
# ORM + values:仅取必要字段,避免加载不需要的列
qs = (
User.objects
.values('id', 'email', 'first_name', 'last_name', 'username')
.order_by('id')
)
paginator = Paginator(qs, per_page)
try:
page_obj = paginator.page(page)
except EmptyPage:
return JsonResponse(
{'error': 'Page out of range', 'total_pages': paginator.num_pages},
status=404
)
# 列表推导 + 轻量序列化
data: List[Dict] = [self._serialize_user(u) for u in page_obj.object_list]
logger.info(
'User list requested',
extra={'page': page, 'per_page': per_page, 'format': fmt, 'count': len(data)}
)
if fmt == 'csv':
# Streaming CSV,避免一次性拼接大字符串造成内存压力
filename = Path(f'users_page_{page}.csv').name
response = StreamingHttpResponse(
self._csv_row_generator(data),
content_type='text/csv; charset=utf-8'
)
response['Content-Disposition'] = f'attachment; filename="{filename}"'
return response
# 标准 JSON 响应
return JsonResponse(
{
'data': data,
'count': paginator.count,
'page': page_obj.number,
'total_pages': paginator.num_pages,
'per_page': per_page,
},
json_dumps_params={'ensure_ascii': False}
)
except Exception as exc:
# 结构化日志 + 统一错误响应
logger.exception('Failed to fetch user list', extra={'page': page, 'per_page': per_page, 'format': fmt})
return JsonResponse({'error': 'Internal server error'}, status=500)
@staticmethod
def _serialize_user(u: Dict) -> Dict:
full_name = f"{u.get('first_name', '')} {u.get('last_name', '')}".strip()
name = full_name or u.get('username', '')
return {'id': u['id'], 'name': name, 'email': u.get('email', '')}
@staticmethod
def _csv_row_generator(users: List[Dict]) -> Iterator[str]:
# 使用 csv.writer 保证正确的 CSV 转义;with 上下文管理器管理临时缓冲
yield 'id,name,email\n'
for u in users:
with io.StringIO() as s:
writer = csv.writer(s)
writer.writerow([u['id'], u['name'], u['email']])
yield s.getvalue()
from django.urls import path from .views import UserListView
urlpatterns = [ path('users/', UserListView.as_view(), name='user-list'), ]
下面是按现代 React 最佳实践重构后的代码,并在关键位置用注释标注了改动与原因。随后附上改动说明与收益。
重构后的代码(函数组件 + Hooks + async/await + AbortController + 子组件拆分) import React from 'react';
// 可单元测试的纯函数:数据规范化 export function normalizeItems(data) { const array = Array.isArray(data) ? data : []; return array.map(d => ({ ...d, // 使用可选链与空值合并,确保 name 有值 name: d?.name ?? 'unknown', })); }
// 可单元测试的纯函数:过滤逻辑 export function filterItems(items, filter) { if (!filter) return items; const f = filter.toString(); return items.filter(i => (i?.name ?? '').includes(f)); }
// 子组件拆分,便于复用与测试;React.memo 避免不必要重渲染 const Item = React.memo(function Item({ item }) { return
export default function Dashboard() { // 1) 类组件 -> 函数组件;使用 useState 管理状态 const [items, setItems] = React.useState([]); const [filter, setFilter] = React.useState(''); const [loading, setLoading] = React.useState(false); const [error, setError] = React.useState(null);
// 2) 事件监听在 useEffect 中注册/清理,避免泄漏 React.useEffect(() => { const onResize = () => { console.log('resize'); }; window.addEventListener('resize', onResize); return () => { window.removeEventListener('resize', onResize); // 清理 }; }, []);
// 3) 数据获取:使用 async/await + AbortController;在卸载时取消请求 React.useEffect(() => { let cancelled = false; const controller = new AbortController();
async function fetchData() {
try {
setLoading(true);
setError(null);
const res = await fetch('/api/items', { signal: controller.signal });
const json = await res.json();
const normalized = normalizeItems(json);
if (!cancelled) {
setItems(normalized); // 保证不可变数据更新
}
} catch (e) {
// 统一错误处理与日志;忽略主动取消错误
if (e.name !== 'AbortError') {
console.error('fetch /api/items error:', e);
if (!cancelled) setError(e);
}
} finally {
if (!cancelled) setLoading(false);
}
}
fetchData();
return () => {
cancelled = true; // 标记,防止卸载后 setState
controller.abort(); // 取消进行中的请求
};
}, []);
// 4) 用 useMemo 对过滤结果进行计算与缓存 const filteredList = React.useMemo(() => { return filterItems(items, filter); }, [items, filter]);
// 5) 用 useCallback 稳定事件处理函数引用 const handleFilterChange = React.useCallback((e) => { setFilter(e.target?.value ?? ''); }, []);
return (
更改点标注与好处
将类组件重写为函数组件,使用 useState/useEffect/useMemo/useCallback:
then 回调改为 async/await,并使用 AbortController 支持请求取消与组件卸载清理:
在 useEffect 中注册/清理事件监听,避免内存泄漏;移除不必要的全局监听:
禁止直接修改 state,保证不可变数据;对过滤结果使用 useMemo 提升性能:
使用可选链 ?. 与空值合并 ?? 提高健壮性;统一错误处理与日志:
拆分子组件(列表项)提升复用与可测试性:
单元测试建议(示例思路):
总结 本次重构遵循现代 React 最佳实践,明确副作用边界、避免状态直接变更、引入请求取消与清理机制、提升渲染与数据处理性能,并通过子组件与纯函数拆分提升复用与可测试性。整体代码更健壮、可维护、易扩展。
下面给出基于 Spring Boot + Spring Data JPA 的重构版本,并在代码内用注释标注关键修改点。最后附上变更清单与收益说明,以及可选的测试骨架。
重构后的代码
@Entity @Table(name = "report") public class Report { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id;
@Column(nullable = false) // 可根据实际字段约束调整
private String name;
@Column(nullable = false)
private int score;
public Report() {}
public Report(Long id, String name, int score) {
this.id = id;
this.name = name;
this.score = score;
}
public Long getId() { return id; }
public String getName() { return name; }
public int getScore() { return score; }
public void setId(Long id) { this.id = id; }
public void setName(String name) { this.name = name; }
public void setScore(int score) { this.score = score; }
}
// Repository:由手写 SQL 改为 Spring Data JPA 方法查询 + 分页 // 好处:无需手写 JDBC/SQL 与资源关闭;内置分页/排序 import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository;
public interface ReportRepository extends JpaRepository<Report, Long> {
Page
DTO(不可变,使用 record) // 由可变 POJO 改为 record,不可变更安全 public record ReportDto(Long id, String name, int score) { public static ReportDto from(Report e) { return new ReportDto(e.getId(), e.getName(), e.getScore()); } }
Service(构造器注入 + 事务 + JPA + Page.map) // 由手动 DataSource/JDBC 改为仓库;readOnly 事务;构造器注入 import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional;
@Service @Transactional(readOnly = true) // 变更点:开启只读事务,保证一致性与性能 public class ReportService { private final ReportRepository repository; // 变更点:构造器注入替代字段注入
public ReportService(ReportRepository repository) {
this.repository = repository;
}
public Page<ReportDto> findReports(String q, Pageable pageable) {
// 变更点:分页与排序交给数据库;使用 Page.map 转 DTO
return repository.findByNameContainingIgnoreCase(q, pageable)
.map(ReportDto::from);
}
}
import org.springframework.data.domain.Page;
@RestController @RequestMapping("/reports") // 统一前缀 @Validated // 变更点:启用参数校验 public class ReportController { private static final Logger log = LoggerFactory.getLogger(ReportController.class);
private final ReportService service; // 变更点:构造器注入
public ReportController(ReportService service) {
this.service = service;
}
@GetMapping
public ResponseEntity<Page<ReportDto>> reports(
@RequestParam("q") @NotBlank String q, // 变更点:参数校验
@PageableDefault(size = 20, sort = "score", direction = Sort.Direction.ASC) Pageable pageable // 变更点:分页与默认排序
) {
log.info("Searching reports, q={}", q); // 变更点:统一使用 slf4j 日志
return ResponseEntity.ok(service.findReports(q, pageable));
}
}
说明与变更点汇总
数据访问层:手写 JDBC → Spring Data JPA Repository
依赖注入:字段注入 + 手动构建 DataSource → 构造器注入 + 框架管理 DataSource
控制器:@Controller + @ResponseBody → @RestController + ResponseEntity
DTO:可变 POJO → Java record 不可变对象
日志:System.out.println → slf4j Logger
事务与资源:try-finally 关闭资源 → @Transactional(readOnly = true)
集合处理:手写 Comparator → 数据库排序或 Streams
参数校验与分页:Bean Validation + Pageable
可选:若暂时仍需 JDBC,使用 try-with-resources
// 只作示例,推荐优先使用 JPA
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT id,name,score FROM report WHERE name LIKE ?")) {
ps.setString(1, "%" + q + "%");
try (ResultSet rs = ps.executeQuery()) {
List
测试建议(骨架)
示例(极简伪代码): @DataJpaTest class ReportRepositoryTest { @Autowired ReportRepository repo; @Test void should_query_by_name_with_pagination() { // 给定测试数据... var page = repo.findByNameContainingIgnoreCase("abc", org.springframework.data.domain.PageRequest.of(0, 10, Sort.by("score"))); org.assertj.core.api.Assertions.assertThat(page.getContent()).isSortedAccordingTo(java.util.Comparator.comparingInt(Report::getScore)); } }
@org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc @org.springframework.boot.test.context.SpringBootTest class ReportControllerTest { @Autowired org.springframework.test.web.servlet.MockMvc mockMvc; @org.junit.jupiter.api.Test void should_validate_params_and_return_page() throws Exception { mockMvc.perform(org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get("/reports").param("q", "abc")) .andExpect(org.springframework.test.web.servlet.result.MockMvcResultMatchers.status().isOk()); mockMvc.perform(org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get("/reports").param("q", "")) .andExpect(org.springframework.test.web.servlet.result.MockMvcResultMatchers.status().isBadRequest()); } }
依赖提示
以上重构将数据访问、事务、日志、校验、分页/排序与响应格式系统化、现代化,减少样板与易错点,显著提升可维护性与可测试性。
针对 代码优化与重构 的日常工作场景,该工具旨在解决以下问题:
工具名称: 代码优化指南
功能简介: 将现有代码转换为更符合指定语言或框架习惯的写法,或重构为使用现代语言特性,并标注修改点与改进收益,帮助开发者提升代码质量和可维护性。
完整的代码质量提升流程,从代码审查到优化重构,再到测试验证的全链路协作。
通过提示词快速重构代码,实现规范化并利用最新技术特性,让代码质量和效率显著提升。
应用提示词优化现有项目代码,减少技术债,推进整个团队技术栈现代化演进。
快速提升个人项目的代码质量,无需查阅大量文档即可高效使用现代特性和框架。
将模板生成的提示词复制粘贴到您常用的 Chat 应用(如 ChatGPT、Claude 等),即可直接对话使用,无需额外开发。适合个人快速体验和轻量使用场景。
把提示词模板转化为 API,您的程序可任意修改模板参数,通过接口直接调用,轻松实现自动化与批量处理。适合开发者集成与业务系统嵌入。
在 MCP client 中配置对应的 server 地址,让您的 AI 应用自动调用提示词模板。适合高级用户和团队协作,让提示词在不同 AI 工具间无缝衔接。
免费获取高级提示词-优惠即将到期