正在学习
10.3 增量重构与文档化
重构之后
import hashlib
import sqlite3
from typing import Optional
class DatabaseHelper:
"""用于数据库交互的实用工具类。"""
def __init__(self, db_path: str):
self.db_path = db_path
def execute_query(self, query: str, params: tuple = ()) -> Optional[list]:
"""执行查询并返回可用的获取结果。"""
with sqlite3.connect(self.db_path) as conn:
cur = conn.cursor()
cur.execute(query, params)
if query.strip().lower().startswith("select"):
return cur.fetchall()
conn.commit()
return None
class AuthManager:
"""处理用户注册和登录认证。"""
def __init__(self, db_helper: DatabaseHelper):
self.db = db_helper
def _hash_password(self, password: str) -> str:
"""使用 SHA-256 对密码进行哈希处理。"""
return hashlib.sha256(password.encode()).hexdigest()
def register_user(self, username: str, password: str):
"""通过保存哈希后的密码来注册新用户。"""
hashed = self._hash_password(password)
self.db.execute_query(
"INSERT INTO users (username, password) VALUES (?, ?)",
(username, hashed)
)
def login(self, username: str, password: str) -> bool:
"""根据存储的哈希值验证用户凭据。"""
result = self.db.execute_query(
"SELECT password FROM users WHERE username=?", (username,)
)
if not result:
return False
stored_hash = result[0][0]
return stored_hash == self._hash_password(password)
此次重构引入了单一职责设计,同时保留了完全相同的功能。Claude 还添加了文档字符串并提升了可读性 —— 展示了在不破坏兼容性的前提下进行渐进式改进。
你可以在此提示的基础上进行扩展:
"Claude,为 DatabaseHelper 和 AuthManager 生成单元测试,以验证重构后的行为。"
Claude 将会返回一个完整的、可运行的基于 pytest 的测试套件,在提交前验证此次重构。
澄清表:重构工作流总结
| 步骤 | 目标 | Claude 的角色 | 开发者的行动 |
|---|---|---|---|
| 1. 定义范围 | 确定要重构的一个类或函数 | 理解用途和依赖关系 | 提供清晰的上下文 |
| 2. 生成重构 | 在不改变行为的前提下重写逻辑 | 生成优化且有文档说明的代码 | 审查并测试输出 |
| 3. 验证 | 确认新旧版本行为一致 | 编写或检查单元测试 | 在本地运行测试 |
| 4. 文档化 | 解释更改的内容及原因 | 添加文档字符串和更新日志文本 | 提交并推送 |
| 5. 迭代 | 继续处理下一个组件 | 保持风格的连续性 | 在新模块中重复此过程 |
使用 Claude Code 进行渐进式重构为现代化大型项目提供了一条安全、结构化的路径。开发人员可以通过经过验证的、稳定的改进来演进系统,而不是进行高风险的完全重写。自我文档化功能(如文档字符串和更新日志)的引入,确保了长期的可维护性和清晰性。
通过采用由 Claude 辅助的小型迭代,团队可以确信每一次更改都强化了代码库,而不会破坏稳定性。在下一节中,我们将在此方法的基础上探讨多文件一致性和文档对齐,确保随着代码的演进,架构和书面文档也能同步发展。
10.4 在多个提示中保持一致性
在大型项目中使用 Claude Code 时,开发人员通常会将交互拆分为多个提示 —— 每个提示对应一个模块、功能或调试会话。然而,随着项目的增长,在这些提示之间保持一致性成为一项关键挑战。如果没有连续性,Claude 可能会做出偏离团队标准的样式更改、以不同方式重命名变量,或者对先前的上下文做出不一致的解释。
Claude 的对话智能可以在单个会话内保持上下文,但当跨多个会话或团队成员协作时,开发人员仍需手动管理提示的一致性。在本节中,我们将探讨如何在与 Claude 的所有交互中保持一致的语调、结构和编码标准。你将学习建立持久上下文、强制实施样式规则以及让 Claude 在整个长期项目中与团队"保持同步"的技术。
概念发展
Claude 不会在不同的提示之间存储长期记忆;它仅使用你提供的上下文。这意味着保持一致性需要有策略的提示工程和严谨的工作流程。以下是实现这一目标的三个基本原则:
- 持久上下文共享 —— 维护一个轻量级的"Claude 上下文文件"(例如
claude_context.md),其中概述编码约定、架构和项目目标。你可以在每个新 Claude 会话开始时粘贴此文件以重新建立一致性。 - 样式和语调锚定 —— 一次性定义特定的约定并保持一致地复用。这包括命名标准、文档字符串格式、测试模式和文件结构。只要每次都重申这些规则,Claude 就能完全遵循。
- 增量会话链接 —— 当任务跨越多个提示时,提醒 Claude 之前完成的工作。例如:"这是你之前帮助重构的类 —— 现在让我们为它添加单元测试。"这可以防止 Claude 对代码意图或依赖关系产生偏离的假设。
这些技术共同确保每次交互 —— 无论多么孤立 —— 都有助于产生统一、可预测的项目输出。
动手实践示例:使用共享的上下文文件
想象你正在开发一个基于 FastAPI 的内部服务,多名工程师在不同的模块中使用 Claude。在没有共享上下文的情况下,每个开发者的提示可能会导致结构不一致。为了解决这个问题,你创建了一个名为 claude_context.md 的中央上下文文件,用来定义项目的预期规范。
练习题
DatabaseHelper类的主要用途是什么?
在 DatabaseHelper 类中,execute_query 方法对于 SELECT 查询返回什么?
AuthManager 类的用途是什么?
AuthManager 类中的 _hash_password 方法是如何对密码进行哈希处理的?
关于 AuthManager 类中的 register_user 方法,下列哪些说法是正确的?(选择所有适用的)
哪些步骤是重构工作流的一部分?(选择所有适用的)
AuthManager 类中的 login 方法在提供的密码与存储的哈希匹配时返回 True。
DatabaseHelper 类对所有类型的查询都会将更改提交到数据库。
AuthManager 类中的 _____ 方法负责使用 SHA-256 对密码进行哈希处理。
_____类被AuthManager类用于与数据库交互。
解释 DatabaseHelper 类中 execute_query 方法的用途。
描述 AuthManager 类的登录方法中验证用户凭据的过程。
哪些原则有助于在多个提示之间保持一致性?(选择所有适用的)
DatabaseHelper 类被设计为仅处理 SELECT 查询。
在重构后的代码中,将数据库操作与认证逻辑分离有什么好处?
在重构后的代码中,DatabaseHelper 类的主要用途是什么?
文中描述的重构工作流程包含以下哪些步骤?(选择所有适用的)
在重构后的代码中,AuthManager类既负责哈希密码,又负责执行数据库查询。
AuthManager 类中的 __________ 方法用于在将密码存储到数据库之前使用 SHA-256 对密码进行哈希处理。
请解释 DatabaseHelper 类中的 execute_query 方法是如何在重构后的代码中实现关注点分离的。
登录后解锁笔记、知识点解析、AI 问答
立即登录