@pigcloud/skills 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +70 -0
- package/LICENSE +201 -0
- package/README.en.md +84 -0
- package/README.md +79 -0
- package/bin/cli.js +663 -0
- package/bin/postinstall.js +60 -0
- package/bin/rules-loader.js +484 -0
- package/bin/runtime-bootstrap.js +121 -0
- package/index.js +7 -0
- package/install.cmd +5 -0
- package/install.ps1 +74 -0
- package/install.sh +168 -0
- package/package.json +70 -0
- package/pig-cloud-skills-commands/.codex-plugin/plugin.json +35 -0
- package/pig-cloud-skills-commands/README.md +24 -0
- package/pig-cloud-skills-commands/commands/analyze.md +21 -0
- package/pig-cloud-skills-commands/commands/build.md +21 -0
- package/pig-cloud-skills-commands/commands/design.md +21 -0
- package/pig-cloud-skills-commands/commands/distill.md +21 -0
- package/pig-cloud-skills-commands/commands/doc.md +21 -0
- package/pig-cloud-skills-commands/commands/infra.md +21 -0
- package/pig-cloud-skills-commands/commands/init.md +20 -0
- package/pig-cloud-skills-commands/commands/kb.md +20 -0
- package/pig-cloud-skills-commands/commands/perf.md +20 -0
- package/pig-cloud-skills-commands/commands/prd.md +21 -0
- package/pig-cloud-skills-commands/commands/review.md +21 -0
- package/pig-cloud-skills-commands/commands/security.md +21 -0
- package/pig-cloud-skills-commands/commands/test.md +21 -0
- package/pig-cloud-skills-commands/commands/workflow.md +20 -0
- package/rules/bundles.json +358 -0
- package/rules/coding/analysis.md +27 -0
- package/rules/coding/backend/cache-invalidation.md +30 -0
- package/rules/coding/backend/cache-keying.md +30 -0
- package/rules/coding/backend/cache.md +37 -0
- package/rules/coding/backend/database.md +32 -0
- package/rules/coding/backend/feign.md +30 -0
- package/rules/coding/backend/index.md +42 -0
- package/rules/coding/backend/query.md +32 -0
- package/rules/coding/backend/remote.md +33 -0
- package/rules/coding/backend/transaction-boundary.md +30 -0
- package/rules/coding/backend/transaction-rollback.md +30 -0
- package/rules/coding/backend/transaction.md +38 -0
- package/rules/coding/boundary.md +25 -0
- package/rules/coding/implementation.md +30 -0
- package/rules/coding/index.md +38 -0
- package/rules/coding/scaffold.md +28 -0
- package/rules/coding/testing.md +29 -0
- package/rules/coding/validation.md +29 -0
- package/rules/core/code-quality.md +30 -0
- package/rules/core/evidence.md +26 -0
- package/rules/core/index.md +41 -0
- package/rules/core/interface.md +26 -0
- package/rules/core/iteration.md +26 -0
- package/rules/core/layer-boundary.md +25 -0
- package/rules/core/logging.md +26 -0
- package/rules/core/security.md +26 -0
- package/rules/core/task-boundary.md +27 -0
- package/rules/docs/api.md +34 -0
- package/rules/docs/capture-summary.md +29 -0
- package/rules/docs/capture.md +34 -0
- package/rules/docs/contract.md +30 -0
- package/rules/docs/decision-log.md +32 -0
- package/rules/docs/examples.md +28 -0
- package/rules/docs/index.md +49 -0
- package/rules/docs/reference.md +32 -0
- package/rules/index.md +46 -0
- package/rules/overlays/index.md +28 -0
- package/rules/overlays/pig-cloud/controller.md +33 -0
- package/rules/overlays/pig-cloud/dto-vo.md +33 -0
- package/rules/overlays/pig-cloud/entity.md +32 -0
- package/rules/overlays/pig-cloud/exception.md +32 -0
- package/rules/overlays/pig-cloud/layering.md +31 -0
- package/rules/overlays/pig-cloud/mapper.md +32 -0
- package/rules/overlays/pig-cloud/query-style.md +32 -0
- package/rules/overlays/pig-cloud/rest-response.md +33 -0
- package/rules/overlays/pig-cloud/service.md +33 -0
- package/rules/overlays/pig-cloud/transactions.md +32 -0
- package/rules/overlays/pig-cloud/validation.md +33 -0
- package/rules/overlays/pig-cloud.md +45 -0
- package/rules/product/acceptance.md +25 -0
- package/rules/product/briefing.md +27 -0
- package/rules/product/index.md +36 -0
- package/rules/product/intake.md +27 -0
- package/rules/product/modeling.md +25 -0
- package/rules/product/project-context.md +29 -0
- package/rules/review/code.md +35 -0
- package/rules/review/evidence.md +31 -0
- package/rules/review/index.md +50 -0
- package/rules/review/java.md +42 -0
- package/rules/review/performance.md +38 -0
- package/rules/review/rubric.md +28 -0
- package/rules/review/security.md +38 -0
- package/rules/review/ts.md +33 -0
- package/rules/review/vue.md +33 -0
- package/rules/skill-profile-map.json +58 -0
- package/rules/skill-profile-map.md +28 -0
- package/rules/workflow/handoff.md +25 -0
- package/rules/workflow/index.md +37 -0
- package/rules/workflow/refinement.md +29 -0
- package/rules/workflow/router.md +25 -0
- package/rules/workflow/selection.md +25 -0
- package/rules/workflow/stop.md +25 -0
- package/scripts/ci-validator.sh +114 -0
- package/scripts/run-golden-replays.js +312 -0
- package/scripts/validate-rules.js +125 -0
- package/scripts/validate-skill-replay-signals.js +75 -0
- package/scripts/validate-skill-shapes.js +141 -0
- package/scripts/validate-skill-stop-rules.js +139 -0
- package/scripts/validate-skills.cmd +3 -0
- package/scripts/validate-skills.ps1 +42 -0
- package/scripts/validate-skills.sh +36 -0
- package/skills/api-docs/SKILL.md +76 -0
- package/skills/code-review/SKILL.md +135 -0
- package/skills/code-review/references/findings-template.md +51 -0
- package/skills/code-review/references/performance-checklist.md +213 -0
- package/skills/code-review/references/rubric.md +232 -0
- package/skills/code-review/references/rules.md +32 -0
- package/skills/code-review/references/security-checklist.md +178 -0
- package/skills/code-review/references/stack-notes.md +25 -0
- package/skills/code-review/references/template-review.md +214 -0
- package/skills/code-review/scripts/lint-code-review.mjs +431 -0
- package/skills/domain-modeling/SKILL.md +80 -0
- package/skills/domain-modeling/references/README.md +134 -0
- package/skills/domain-modeling/references/distillation-checklist.md +152 -0
- package/skills/domain-modeling/references/test-cases-template.md +128 -0
- package/skills/environment-deploy/SKILL.md +81 -0
- package/skills/feature-build/SKILL.md +122 -0
- package/skills/feature-build/references/coding-checklist.md +97 -0
- package/skills/feature-build/references/comment-specification.md +102 -0
- package/skills/knowledge-capture/SKILL.md +84 -0
- package/skills/performance-check/SKILL.md +117 -0
- package/skills/product-intake/SKILL.md +98 -0
- package/skills/project-bootstrap/SKILL.md +80 -0
- package/skills/references/agent-personas.md +34 -0
- package/skills/references/anti-rationalization.md +144 -0
- package/skills/references/engineering-delivery-method.md +63 -0
- package/skills/references/engineering-delivery-template.md +80 -0
- package/skills/references/flow-test-cases.md +62 -0
- package/skills/references/full-chain-replay-scenarios.md +79 -0
- package/skills/references/golden-prompt-suite.js +385 -0
- package/skills/references/golden-prompt-suite.md +33 -0
- package/skills/references/hooks.md +67 -0
- package/skills/references/negative-replay-scenarios.md +49 -0
- package/skills/references/project-requirement-alignment.md +41 -0
- package/skills/references/prompt-replay-checklist.md +128 -0
- package/skills/references/requirements-separation-map.md +71 -0
- package/skills/references/rule-loading-map.md +108 -0
- package/skills/references/skill-authoring-standard.md +73 -0
- package/skills/references/skill-boundary-template.md +38 -0
- package/skills/references/skill-enhanced-template.md +53 -0
- package/skills/references/skill-reference-matrix.md +53 -0
- package/skills/references/slash-commands.md +34 -0
- package/skills/security-review/SKILL.md +117 -0
- package/skills/spec-refinement/SKILL.md +143 -0
- package/skills/spec-refinement/references/ears-syntax.md +127 -0
- package/skills/spec-refinement/references/requirement-checklist.md +139 -0
- package/skills/spec-refinement/references/spec-workbook.md +75 -0
- package/skills/technical-design/SKILL.md +105 -0
- package/skills/technical-design/references/solid-checklist.md +199 -0
- package/skills/test-design/SKILL.md +91 -0
- package/skills/workflow-router/SKILL.md +86 -0
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
# EARS 语法参考(Easy Approach to Requirements Syntax)
|
|
2
|
+
|
|
3
|
+
> 消除需求歧义的结构化语法,参考 AWS Kiro 的 Spec 工作流
|
|
4
|
+
|
|
5
|
+
## 核心句式
|
|
6
|
+
|
|
7
|
+
### 1. 用户故事(User Story)
|
|
8
|
+
As a [角色], I want [功能], so that [价值]
|
|
9
|
+
|
|
10
|
+
**示例**:
|
|
11
|
+
- As a 普通用户, I want 查看我的订单列表, so that 我可以追踪订单状态
|
|
12
|
+
- As a 管理员, I want 审核退款申请, so that 我可以控制退款风险
|
|
13
|
+
|
|
14
|
+
### 2. 验收标准(Acceptance Criteria)
|
|
15
|
+
WHEN [事件/条件] THEN the system SHALL [响应/行为]
|
|
16
|
+
|
|
17
|
+
**示例**:
|
|
18
|
+
- WHEN 用户点击"提交订单" THEN the system SHALL 创建订单并返回订单号
|
|
19
|
+
- WHEN 订单金额 <= 0 THEN the system SHALL 拒绝创建并提示"订单金额必须大于0"
|
|
20
|
+
- WHEN 用户未登录 THEN the system SHALL 返回 401 NotLoginException
|
|
21
|
+
|
|
22
|
+
### 3. 业务规则(Business Rule)
|
|
23
|
+
IF [条件] THEN [动作/约束]
|
|
24
|
+
|
|
25
|
+
**示例**:
|
|
26
|
+
- IF 订单状态 != CREATED THEN 抛出 BusinessException("订单状态不正确")
|
|
27
|
+
- IF 用户余额 < 订单金额 THEN 拒绝支付并提示余额不足
|
|
28
|
+
|
|
29
|
+
### 4. 不变式(Invariant)
|
|
30
|
+
ALWAYS [约束] / NEVER [动作]
|
|
31
|
+
|
|
32
|
+
**示例**:
|
|
33
|
+
- ALWAYS 订单号全局唯一
|
|
34
|
+
- NEVER 在事务中执行远程调用
|
|
35
|
+
- ALWAYS 敏感数据脱敏后返回
|
|
36
|
+
|
|
37
|
+
## 语法模式识别
|
|
38
|
+
|
|
39
|
+
从自然语言中识别 EARS 模式:
|
|
40
|
+
|
|
41
|
+
| 自然语言模式 | EARS 句式 | 提取方法 |
|
|
42
|
+
|-------------|----------|---------|
|
|
43
|
+
| "用户可以..." | User Story | 识别角色 + 功能 |
|
|
44
|
+
| "当...时,系统应该..." | Acceptance Criteria | 识别事件 + 响应 |
|
|
45
|
+
| "如果...则..." | Business Rule | 识别条件 + 动作 |
|
|
46
|
+
| "必须..." / "不能..." | Invariant | 识别约束 |
|
|
47
|
+
| "只有...才能..." | Business Rule | 识别前置条件 |
|
|
48
|
+
| "...之后自动..." | Acceptance Criteria | 识别触发事件 + 自动动作 |
|
|
49
|
+
|
|
50
|
+
## 模糊关键词检测
|
|
51
|
+
|
|
52
|
+
以下关键词表示需求可能不明确,需要追问:
|
|
53
|
+
|
|
54
|
+
| 模糊词 | 风险 | 追问方向 |
|
|
55
|
+
|--------|------|---------|
|
|
56
|
+
| 大概/可能/也许 | 不确定性 | 具体条件是什么? |
|
|
57
|
+
| 合适的/适当的 | 主观判断 | 什么标准算"合适"? |
|
|
58
|
+
| 尽量/尽可能 | 非强制 | 是 Must 还是 Should? |
|
|
59
|
+
| 快速/高效 | 无量化 | 具体响应时间要求? |
|
|
60
|
+
| 大量/很多 | 无量化 | 预估数据量级? |
|
|
61
|
+
| 方便/好用 | 主观体验 | 具体交互方式? |
|
|
62
|
+
| 安全的 | 无具体措施 | 具体安全要求? |
|
|
63
|
+
| 有时候/偶尔 | 不确定性 | 触发条件是什么? |
|
|
64
|
+
| 等一下/稍后 | 时序不明确 | 具体时间要求? |
|
|
65
|
+
| 相关的/类似的 | 范围模糊 | 具体包含哪些? |
|
|
66
|
+
|
|
67
|
+
## INVEST 原则
|
|
68
|
+
|
|
69
|
+
评估用户故事质量:
|
|
70
|
+
|
|
71
|
+
| 原则 | 含义 | 检查方法 |
|
|
72
|
+
|------|------|---------|
|
|
73
|
+
| Independent | 独立的,不依赖其他故事 | 是否可单独交付? |
|
|
74
|
+
| Negotiable | 可协商的,细节可讨论 | 是否留有讨论空间? |
|
|
75
|
+
| Valuable | 有价值的,对用户有意义 | 用户是否在乎? |
|
|
76
|
+
| Estimable | 可估算的,复杂度可评估 | 是否能估算工作量? |
|
|
77
|
+
| Small | 足够小,一个迭代可完成 | 是否需要拆分? |
|
|
78
|
+
| Testable | 可测试的,有验收标准 | 是否有明确的通过/失败判定? |
|
|
79
|
+
|
|
80
|
+
## MoSCoW 优先级
|
|
81
|
+
|
|
82
|
+
| 优先级 | 含义 | 判定标准 |
|
|
83
|
+
|--------|------|---------|
|
|
84
|
+
| **Must** | 必须有 | 核心功能,没有则系统不可用 |
|
|
85
|
+
| **Should** | 应该有 | 重要功能,本次迭代尽量实现 |
|
|
86
|
+
| **Could** | 可以有 | 锦上添花,资源允许时实现 |
|
|
87
|
+
| **Won't** | 不会有 | 本次不实现,记录备查 |
|
|
88
|
+
|
|
89
|
+
## 需求 ID 编码规范
|
|
90
|
+
|
|
91
|
+
格式: REQ-{模块缩写}-{序号}
|
|
92
|
+
|
|
93
|
+
示例:
|
|
94
|
+
- REQ-ORD-001: 订单创建
|
|
95
|
+
- REQ-ORD-002: 订单支付
|
|
96
|
+
- REQ-ORD-003: 订单取消
|
|
97
|
+
- REQ-USR-001: 用户注册
|
|
98
|
+
- REQ-USR-002: 用户登录
|
|
99
|
+
|
|
100
|
+
## 正反示例对比
|
|
101
|
+
|
|
102
|
+
### 用户故事
|
|
103
|
+
<good-example>
|
|
104
|
+
As a 普通用户, I want 通过手机号+验证码登录, so that 我无需记住密码即可快速访问
|
|
105
|
+
</good-example>
|
|
106
|
+
|
|
107
|
+
<bad-example>
|
|
108
|
+
用户要能登录系统
|
|
109
|
+
</bad-example>
|
|
110
|
+
|
|
111
|
+
### 验收标准
|
|
112
|
+
<good-example>
|
|
113
|
+
WHEN 用户输入正确手机号和验证码 THEN the system SHALL 返回 JWT Token 和用户信息,响应时间 < 500ms
|
|
114
|
+
</good-example>
|
|
115
|
+
|
|
116
|
+
<bad-example>
|
|
117
|
+
登录成功后返回 Token
|
|
118
|
+
</bad-example>
|
|
119
|
+
|
|
120
|
+
### 业务规则
|
|
121
|
+
<good-example>
|
|
122
|
+
IF 验证码已过期(超过5分钟)THEN the system SHALL 抛出 ParameterIllegalException("验证码已过期,请重新获取") 【服务端强制】
|
|
123
|
+
</good-example>
|
|
124
|
+
|
|
125
|
+
<bad-example>
|
|
126
|
+
验证码不能过期
|
|
127
|
+
</bad-example>
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# 需求分析检查清单
|
|
2
|
+
|
|
3
|
+
> 基于 FURPS+ 模型和 EARS 语法的完整需求分析检查项
|
|
4
|
+
|
|
5
|
+
## 一、需求收集检查
|
|
6
|
+
|
|
7
|
+
### 1.1 业务背景(Why)
|
|
8
|
+
| 检查项 | 通过标准 | 常见问题 |
|
|
9
|
+
|--------|---------|---------|
|
|
10
|
+
| 业务目标明确 | 能用一句话描述功能目标 | "做一个管理系统" |
|
|
11
|
+
| 业务价值清晰 | 能说明解决了什么问题 | "领导要求的" |
|
|
12
|
+
| 业务背景完整 | 能说明触发原因 | 无背景说明 |
|
|
13
|
+
|
|
14
|
+
### 1.2 用户角色(Who)
|
|
15
|
+
| 检查项 | 通过标准 | 常见问题 |
|
|
16
|
+
|--------|---------|---------|
|
|
17
|
+
| 角色定义完整 | 所有操作者角色已列出 | 遗漏旁观者/审核者 |
|
|
18
|
+
| 权限矩阵清晰 | 每个角色能做什么已定义 | "管理员可以操作" |
|
|
19
|
+
| 角色关系明确 | 角色之间的关系已定义 | 无角色层级说明 |
|
|
20
|
+
|
|
21
|
+
### 1.3 业务流程(How)
|
|
22
|
+
| 检查项 | 通过标准 | 常见问题 |
|
|
23
|
+
|--------|---------|---------|
|
|
24
|
+
| 主流程完整 | 正常执行步骤无遗漏 | 跳过中间步骤 |
|
|
25
|
+
| 异常流程覆盖 | 主要异常场景已列出 | "异常以后处理" |
|
|
26
|
+
| 边界条件识别 | 边界值已识别 | 无边界分析 |
|
|
27
|
+
| 分支流程定义 | 条件分支已定义 | "看情况" |
|
|
28
|
+
|
|
29
|
+
### 1.4 数据范围(What)
|
|
30
|
+
| 检查项 | 通过标准 | 常见问题 |
|
|
31
|
+
|--------|---------|---------|
|
|
32
|
+
| In Scope 明确 | 功能范围内的事项已列出 | 范围模糊 |
|
|
33
|
+
| Out Scope 明确 | 明确不做什么 | 无 Out Scope |
|
|
34
|
+
| 数据实体识别 | 涉及的数据实体已列出 | 遗漏关联实体 |
|
|
35
|
+
| 数据量评估 | 预估数据量级 | 无数据量评估 |
|
|
36
|
+
|
|
37
|
+
### 1.5 约束条件(Constraints)
|
|
38
|
+
| 检查项 | 通过标准 | 常见问题 |
|
|
39
|
+
|--------|---------|---------|
|
|
40
|
+
| 性能要求 | 响应时间/并发量已明确 | "要快" |
|
|
41
|
+
| 安全要求 | 认证/授权/脱敏已明确 | "要安全" |
|
|
42
|
+
| 兼容性要求 | 浏览器/版本/接口兼容已明确 | 无兼容性说明 |
|
|
43
|
+
| 技术约束 | 技术栈/框架限制已明确 | 无技术约束 |
|
|
44
|
+
|
|
45
|
+
## 二、需求结构化检查(EARS 语法)
|
|
46
|
+
|
|
47
|
+
### 2.1 用户故事
|
|
48
|
+
| 检查项 | 通过标准 | 错误示例 | 正确示例 |
|
|
49
|
+
|--------|---------|---------|---------|
|
|
50
|
+
| 角色明确 | As a [具体角色] | As a user | As a 普通用户 |
|
|
51
|
+
| 功能明确 | I want [具体功能] | I want 管理 | I want 创建、编辑、删除订单 |
|
|
52
|
+
| 价值明确 | so that [具体价值] | so that 方便 | so that 可以追踪订单状态 |
|
|
53
|
+
| INVEST 原则 | Independent/Negotiable/Valuable/Estimable/Small/Testable | - | - |
|
|
54
|
+
|
|
55
|
+
### 2.2 验收标准
|
|
56
|
+
| 检查项 | 通过标准 | 错误示例 | 正确示例 |
|
|
57
|
+
|--------|---------|---------|---------|
|
|
58
|
+
| WHEN 条件明确 | 触发事件清晰 | WHEN 用户操作 | WHEN 用户点击"提交订单"按钮 |
|
|
59
|
+
| THEN 响应明确 | 系统响应可验证 | THEN 成功 | THEN 系统返回 Result<OrderVO>,订单状态变为 PAID |
|
|
60
|
+
| 可验证性 | 有明确的通过/失败判定 | THEN 快速响应 | THEN 响应时间 < 500ms |
|
|
61
|
+
| 边界覆盖 | 边界条件有验收标准 | - | WHEN 金额为 0.01 THEN ... |
|
|
62
|
+
|
|
63
|
+
### 2.3 业务规则
|
|
64
|
+
| 检查项 | 通过标准 | 错误示例 | 正确示例 |
|
|
65
|
+
|--------|---------|---------|---------|
|
|
66
|
+
| 条件清晰 | IF 条件明确 | IF 金额不对 | IF 订单金额 <= 0 |
|
|
67
|
+
| 动作明确 | THEN 动作可执行 | THEN 报错 | THEN 抛出 ParameterIllegalException("订单金额必须大于0") |
|
|
68
|
+
| 执行方标注 | 标注谁来保证 | 无标注 | 【服务端强制】/【调用方需预判】 |
|
|
69
|
+
|
|
70
|
+
## 三、需求质量检查
|
|
71
|
+
|
|
72
|
+
### 3.1 隐含假设
|
|
73
|
+
| 检查项 | 检查方法 |
|
|
74
|
+
|--------|---------|
|
|
75
|
+
| 数据量假设 | "如果数据量增长 10 倍,这个需求还成立吗?" |
|
|
76
|
+
| 并发假设 | "如果 100 个用户同时操作,会怎样?" |
|
|
77
|
+
| 时序假设 | "如果操作顺序颠倒,会怎样?" |
|
|
78
|
+
| 外部依赖假设 | "如果依赖的外部系统不可用,会怎样?" |
|
|
79
|
+
| 权限假设 | "如果用户没有预期权限,会怎样?" |
|
|
80
|
+
|
|
81
|
+
### 3.2 矛盾检测
|
|
82
|
+
| 检查维度 | 检查方法 | 示例 |
|
|
83
|
+
|---------|---------|------|
|
|
84
|
+
| 权限矛盾 | A 要求开放 vs B 要求限制 | "所有接口公开" vs "需要管理员权限" |
|
|
85
|
+
| 状态矛盾 | A 的流转 vs B 的流转 | "订单不可取消" vs "支持退款" |
|
|
86
|
+
| 数据矛盾 | A 的唯一性 vs B 的重复 | "手机号唯一" vs "允许更换手机号" |
|
|
87
|
+
| 时序矛盾 | A 实时 vs B 批量 | "实时通知" vs "每天汇总" |
|
|
88
|
+
|
|
89
|
+
### 3.3 可测试性
|
|
90
|
+
| 检查项 | 通过标准 | 不可测试示例 | 可测试示例 |
|
|
91
|
+
|--------|---------|-------------|-----------|
|
|
92
|
+
| 可验证 | 有明确通过/失败判定 | "系统应该快速响应" | "P99 响应时间 < 200ms" |
|
|
93
|
+
| 可量化 | 有具体数值 | "支持大量数据" | "支持 10 万条记录分页查询" |
|
|
94
|
+
| 可复现 | 测试步骤可重复 | "有时候会出错" | "当金额为负数时抛出异常" |
|
|
95
|
+
|
|
96
|
+
## 四、需求完整性检查(FURPS+)
|
|
97
|
+
|
|
98
|
+
| 维度 | 全称 | 检查项 | 通过标准 |
|
|
99
|
+
|------|------|--------|---------|
|
|
100
|
+
| F | Functionality | 功能完整性 | 每个功能点有输入/输出/规则 |
|
|
101
|
+
| U | Usability | 可用性 | 用户角色和权限已定义 |
|
|
102
|
+
| R | Reliability | 可靠性 | 异常处理策略已定义 |
|
|
103
|
+
| P | Performance | 性能 | 响应时间/并发量已明确 |
|
|
104
|
+
| S | Supportability | 可支持性 | 日志/监控/缓存策略已分析 |
|
|
105
|
+
| + | 其他 | 安全/合规/兼容 | 安全要求/合规要求已明确 |
|
|
106
|
+
|
|
107
|
+
## 五、迭代开发额外检查
|
|
108
|
+
|
|
109
|
+
### 5.1 影响分析
|
|
110
|
+
| 检查项 | 通过标准 |
|
|
111
|
+
|--------|---------|
|
|
112
|
+
| 模块依赖 | 受影响模块已识别 |
|
|
113
|
+
| API 调用链 | Feign 调用影响已分析 |
|
|
114
|
+
| 数据依赖 | 实体关联影响已分析 |
|
|
115
|
+
| 状态流转 | 状态变更影响已分析 |
|
|
116
|
+
| 回归风险 | 回归测试范围已评估 |
|
|
117
|
+
|
|
118
|
+
### 5.2 风险评估
|
|
119
|
+
| 风险等级 | 判定条件 | 处理方式 |
|
|
120
|
+
|---------|---------|---------|
|
|
121
|
+
| Critical | 涉及核心流程 + 跨服务调用 + 事务边界 | 必须有回滚方案 |
|
|
122
|
+
| High | 涉及状态变更 + 权限变更 + 数据结构变更 | 需要回归测试 |
|
|
123
|
+
| Medium | 涉及查询逻辑 + UI 字段调整 | 建议回归测试 |
|
|
124
|
+
| Low | 涉及日志 + 注释 + 代码重构 | 常规测试 |
|
|
125
|
+
|
|
126
|
+
## 六、Anti-rationalization Table (Requirement Analysis)
|
|
127
|
+
|
|
128
|
+
| 常见借口 | 反驳理由 | 正确做法 |
|
|
129
|
+
|---------|---------|---------|
|
|
130
|
+
| "需求很清楚,不需要文档" | 清楚的需求也会变化 | 编写需求文档 |
|
|
131
|
+
| "这个功能很简单" | 简单功能也有边界情况 | 完整需求分析 |
|
|
132
|
+
| "用户会这样操作" | 用户操作方式多样 | 分析所有场景 |
|
|
133
|
+
| "这个边界不会发生" | 边界情况总会发生 | 处理边界 |
|
|
134
|
+
| "这个功能以后再加" | 以后加的成本更高 | 现在规划 |
|
|
135
|
+
| "这个影响范围很小" | 小影响也会产生连锁反应 | 完整影响分析 |
|
|
136
|
+
| "这个模块不依赖其他模块" | 模块间总有依赖 | 分析依赖 |
|
|
137
|
+
| "先做再说,需求以后补" | 无文档的需求无法维护 | 先需求后实现 |
|
|
138
|
+
| "用户说的就是需求" | 用户说的往往是解决方案而非需求 | 追问真实意图 |
|
|
139
|
+
| "这个验收标准够了" | 不完整的验收标准导致返工 | 覆盖正常/异常/边界 |
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Requirement Spec Workbook
|
|
2
|
+
|
|
3
|
+
> 闇€姹傚垎鏋愮殑鍙鐢ㄦā鏉夸笌妫€鏌ラ」銆俙SKILL.md` 鍙繚鐣欐祦绋嬶紝杩欓噷淇濈暀浜у嚭缁撴瀯鍜屽父鐢ㄦ槧灏勩€傞渶瑕佸叿浣撹鍒欐椂锛屼紭鍏堝紩鐢?[rules/index.md](/D:/work/java/pig-skills/rules/index.md) 鍜屽搴斿瓙瑙勫垯銆?
|
|
4
|
+
## EARS Template
|
|
5
|
+
|
|
6
|
+
```markdown
|
|
7
|
+
### REQ-001: [闇€姹傛爣棰榏
|
|
8
|
+
- **浼樺厛绾?*: Must | Should | Could | Won't
|
|
9
|
+
- **鐢ㄦ埛鏁呬簨**: As a [role], I want [feature], so that [benefit]
|
|
10
|
+
- **楠屾敹鏍囧噯**:
|
|
11
|
+
- WHEN [event] THEN the system SHALL [response]
|
|
12
|
+
- **涓氬姟瑙勫垯**:
|
|
13
|
+
- IF [condition] THEN [action/constraint]
|
|
14
|
+
- **涓嶅彉寮?*:
|
|
15
|
+
- ALWAYS [constraint]
|
|
16
|
+
- NEVER [action]
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Assumption Checklist
|
|
20
|
+
|
|
21
|
+
| 鍋囪 ID | 鍏宠仈闇€姹?| 鍋囪鍐呭 | 椋庨櫓绛夌骇 | 楠岃瘉鏂瑰紡 |
|
|
22
|
+
|---------|---------|---------|---------|---------|
|
|
23
|
+
| ASM-001 | REQ-001 | 鐢ㄦ埛宸茬櫥褰曚笖鏈夋湁鏁堟敹璐у湴鍧€ | 楂?| 鍓嶇疆楠岃瘉 |
|
|
24
|
+
| ASM-002 | REQ-003 | 鏀粯鎺ュ彛鍝嶅簲鏃堕棿 < 3s | 涓?| 鍘嬫祴楠岃瘉 |
|
|
25
|
+
| ASM-003 | REQ-005 | 鍟嗗搧浠锋牸鍦ㄤ笅鍗曞悗涓嶅彉 | 楂?| 浠锋牸閿佸畾鏈哄埗 |
|
|
26
|
+
|
|
27
|
+
## Conflict Report
|
|
28
|
+
|
|
29
|
+
| 鍐茬獊 ID | 娑夊強闇€姹?| 鍐茬獊绫诲瀷 | 鎻忚堪 | 寤鸿鏂规 |
|
|
30
|
+
|---------|---------|---------|------|---------|
|
|
31
|
+
| CONFLICT-001 | REQ-002, REQ-004 | 鐘舵€佸啿绐?| 宸插彂璐ц鍗曠殑鍙栨秷绛栫暐鍐茬獊 | 缁熶竴涓轰笉鍙彇娑?/ 澧炲姞瀹℃牳鍙栨秷娴佺▼ |
|
|
32
|
+
|
|
33
|
+
## Capability Map
|
|
34
|
+
|
|
35
|
+
| 闇€姹?ID | 闇€姹傛弿杩?| 鑳藉姏鍒嗙被 | 妗嗘灦鏀寔鏂瑰紡 | 澶囨敞 |
|
|
36
|
+
|---------|---------|---------|-------------|------|
|
|
37
|
+
| REQ-001 | RESTful API 杩斿洖 | 鍘熺敓鏀寔 | Result<T> + @RestController | - |
|
|
38
|
+
| REQ-003 | 鏁版嵁鏉冮檺闅旂 | 鍘熺敓鏀寔 | @IgnoreTenant + 澶氱鎴锋嫤鎴櫒 | - |
|
|
39
|
+
| REQ-005 | PDF 瀵煎嚭 | 鍙墿灞曟敮鎸?| 鑷畾涔?Starter 鎴栨帴鍏?iText | 璇勪及宸ヤ綔閲?|
|
|
40
|
+
| REQ-008 | 瀹炴椂娑堟伅鎺ㄩ€?| 涓嶆敮鎸?| 闇€寮曞叆 WebSocket/MQ | 璇勪及寮曞叆鎴愭湰 |
|
|
41
|
+
|
|
42
|
+
## Output Template
|
|
43
|
+
|
|
44
|
+
```markdown
|
|
45
|
+
# {妯″潡鍚峿 闇€姹傛枃妗?
|
|
46
|
+
|
|
47
|
+
## 1. 鍔熻兘姒傝堪
|
|
48
|
+
## 2. 鍔熻兘鑼冨洿
|
|
49
|
+
## 3. 缁撴瀯鍖栭渶姹傦紙EARS锛?
|
|
50
|
+
## 4. 闅愬惈鍋囪
|
|
51
|
+
## 5. 闇€姹傚啿绐佹鏌?
|
|
52
|
+
## 6. 妗嗘灦鑳藉姏鏄犲皠
|
|
53
|
+
## 7. 楠屾敹鏍囧噯锛圔DD锛?
|
|
54
|
+
## 8. 闈炲姛鑳芥€ч渶姹?
|
|
55
|
+
## 9. 瀹屾暣鎬ф鏌ユ姤鍛?
|
|
56
|
+
## 10. 褰卞搷鍒嗘瀽锛堜粎杩唬妯″紡锛?
|
|
57
|
+
## 11. 瀹炵幇闃舵杈撳叆鎽樿
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Iteration Impact Summary
|
|
61
|
+
|
|
62
|
+
| 鍙樻洿椤?| 姒傜巼 | 褰卞搷 | 椋庨櫓绛夌骇 | 鍥炲綊绛栫暐 |
|
|
63
|
+
|--------|------|------|---------|---------|
|
|
64
|
+
| 璁㈠崟鐘舵€佹祦杞慨鏀?| 楂?| 楂?| Critical | 鍏ㄩ噺鍥炲綊 |
|
|
65
|
+
| 鏂板瀹℃牳瀛楁 | 楂?| 涓?| High | 妯″潡鍥炲綊 |
|
|
66
|
+
| API 鍝嶅簲鎵╁睍 | 涓?| 浣?| Low | 澧為噺娴嬭瘯 |
|
|
67
|
+
|
|
68
|
+
## Anti-rationalization
|
|
69
|
+
|
|
70
|
+
| 甯歌鍊熷彛 | 鍙嶉┏ |
|
|
71
|
+
|---------|------|
|
|
72
|
+
| 鈥滈渶姹傚凡缁忓緢娓呮浜嗭紝涓嶉渶瑕佸啀闂€?| 鍏堝仛涓€娆℃緞娓呭洖璺?|
|
|
73
|
+
| 鈥滃厛鍋氳璁★紝闇€姹傚彲浠ヨ竟鍋氳竟瀹屽杽鈥?| 鍏堥渶姹傚悗璁捐 |
|
|
74
|
+
| 鈥滃奖鍝嶅垎鏋愬お鑰楁椂浜嗏€?| 璺宠繃浼氭妸椋庨櫓甯﹀埌鍚庨潰 |
|
|
75
|
+
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: technical-design
|
|
3
|
+
description: Shape architecture and implementation boundaries from a stable spec when modules, interfaces, or dependencies still need decisions
|
|
4
|
+
lifecycle_stage: design
|
|
5
|
+
rule_profile: analysis
|
|
6
|
+
dependencies:
|
|
7
|
+
- spec-refinement
|
|
8
|
+
triggers:
|
|
9
|
+
- architecture decision
|
|
10
|
+
- module split
|
|
11
|
+
- interface contract
|
|
12
|
+
- dependency direction
|
|
13
|
+
- design boundary
|
|
14
|
+
inputs:
|
|
15
|
+
- executable spec
|
|
16
|
+
- selected rules bundle
|
|
17
|
+
- existing module context
|
|
18
|
+
outputs:
|
|
19
|
+
- design decisions
|
|
20
|
+
- dependency map
|
|
21
|
+
- interface contract
|
|
22
|
+
- implementation constraints
|
|
23
|
+
workflow:
|
|
24
|
+
- confirm the spec is stable enough for design work
|
|
25
|
+
- define boundaries, dependencies, and interfaces
|
|
26
|
+
- map design decisions to the rules bundle
|
|
27
|
+
- hand off to feature-build
|
|
28
|
+
gates:
|
|
29
|
+
- stop at design decisions
|
|
30
|
+
- do not reopen product discovery
|
|
31
|
+
- do not produce full code
|
|
32
|
+
- do not skip rule loading
|
|
33
|
+
refs:
|
|
34
|
+
- skills/references/rule-loading-map.md
|
|
35
|
+
- skills/references/flow-test-cases.md
|
|
36
|
+
- skills/references/full-chain-replay-scenarios.md
|
|
37
|
+
- skills/references/prompt-replay-checklist.md
|
|
38
|
+
- rules/index.md
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
# Technical Design
|
|
42
|
+
|
|
43
|
+
## Purpose
|
|
44
|
+
|
|
45
|
+
Turn a stable spec into concrete architecture and implementation boundaries.
|
|
46
|
+
|
|
47
|
+
## Suitable / Unsuitable
|
|
48
|
+
|
|
49
|
+
- Suitable: architecture decisions, module split, interfaces, dependency direction, constraint mapping
|
|
50
|
+
- Unsuitable: requirement discovery, code generation, redesigning the PRD, unresolved scope gaps, ignoring the rules bundle
|
|
51
|
+
|
|
52
|
+
## Quick Start
|
|
53
|
+
|
|
54
|
+
- Start from the stable spec and isolate the decisions that affect boundaries or dependencies.
|
|
55
|
+
- Load the smallest rules bundle that matches the current task context.
|
|
56
|
+
- Turn design choices into implementation constraints, not code.
|
|
57
|
+
- If the spec is still unstable, stop and return to `spec-refinement`.
|
|
58
|
+
|
|
59
|
+
## Inputs / Outputs
|
|
60
|
+
|
|
61
|
+
- Inputs:
|
|
62
|
+
- executable spec
|
|
63
|
+
- selected rules bundle
|
|
64
|
+
- existing module context
|
|
65
|
+
- Outputs:
|
|
66
|
+
- design decisions
|
|
67
|
+
- dependency map
|
|
68
|
+
- interface contract
|
|
69
|
+
- implementation constraints
|
|
70
|
+
|
|
71
|
+
## Workflow
|
|
72
|
+
|
|
73
|
+
1. Confirm the spec is stable enough for design work.
|
|
74
|
+
2. Define boundaries, dependencies, and interfaces.
|
|
75
|
+
3. Route scope gaps back to `spec-refinement` instead of forcing design decisions.
|
|
76
|
+
4. Map design decisions to the rules bundle.
|
|
77
|
+
5. Produce implementation constraints for `feature-build`.
|
|
78
|
+
|
|
79
|
+
## Replay Signals
|
|
80
|
+
|
|
81
|
+
- Input signal: multi-module change, boundary ambiguity, dependency risk, or compatibility concern.
|
|
82
|
+
- Output to verify: design decisions, dependency map, interface contract, implementation constraints.
|
|
83
|
+
- Stop signal: full code, reopened product discovery, or skipped rules loading.
|
|
84
|
+
- Handoff signal: implementation can start inside `feature-build`.
|
|
85
|
+
|
|
86
|
+
## Gotchas
|
|
87
|
+
|
|
88
|
+
- Do not turn unresolved requirement issues into design decisions.
|
|
89
|
+
- Do not skip rule loading when rule constraints matter.
|
|
90
|
+
- Do not output full code or pseudo-code as the design artifact.
|
|
91
|
+
- Do not collapse boundaries just to reduce context.
|
|
92
|
+
- Do not keep working if the spec is not stable enough to design.
|
|
93
|
+
|
|
94
|
+
## Stop Rules
|
|
95
|
+
|
|
96
|
+
- Stop at design decisions.
|
|
97
|
+
- Do not reopen product discovery.
|
|
98
|
+
- Do not produce full code.
|
|
99
|
+
- Do not skip rule loading.
|
|
100
|
+
|
|
101
|
+
## References
|
|
102
|
+
|
|
103
|
+
- `skills/references/rule-loading-map.md`
|
|
104
|
+
- `skills/references/flow-test-cases.md`
|
|
105
|
+
- `rules/index.md`
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
# SOLID 检查清单
|
|
2
|
+
|
|
3
|
+
> 面向对象设计五大原则检查项
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## S - Single Responsibility Principle (单一职责原则)
|
|
8
|
+
|
|
9
|
+
**定义**:一个类应该只有一个引起它变化的原因
|
|
10
|
+
|
|
11
|
+
| 检查项 | 问题信号 | 修复方案 |
|
|
12
|
+
|--------|----------|----------|
|
|
13
|
+
| 类职责过多 | 类名包含"And"或"Or" | 拆分为多个类 |
|
|
14
|
+
| 方法类型混杂 | CRUD + 业务逻辑 + 工具方法 | 分离到不同类 |
|
|
15
|
+
| 字段分组明显 | 字段可按功能分组 | 拆分为多个类 |
|
|
16
|
+
| 变更频率不同 | 部分方法频繁变更,部分不变 | 拆分为多个类 |
|
|
17
|
+
|
|
18
|
+
**示例**:
|
|
19
|
+
```java
|
|
20
|
+
// ❌ 违反 SRP:订单类同时处理订单数据和邮件通知
|
|
21
|
+
public class Order {
|
|
22
|
+
private Long id;
|
|
23
|
+
private String orderNo;
|
|
24
|
+
|
|
25
|
+
public void calculateTotal() { }
|
|
26
|
+
public void sendEmail() { } // 应分离到 NotificationService
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// ✅ 符合 SRP:职责分离
|
|
30
|
+
public class OrderEntity {
|
|
31
|
+
private Long id;
|
|
32
|
+
private String orderNo;
|
|
33
|
+
public void calculateTotal() { }
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
public class NotificationService {
|
|
37
|
+
public void sendOrderEmail(OrderEntity order) { }
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## O - Open/Closed Principle (开闭原则)
|
|
44
|
+
|
|
45
|
+
**定义**:对扩展开放,对修改关闭
|
|
46
|
+
|
|
47
|
+
| 检查项 | 问题信号 | 修复方案 |
|
|
48
|
+
|--------|----------|----------|
|
|
49
|
+
| 硬编码条件 | if-else 类型判断 | 使用策略模式/多态 |
|
|
50
|
+
| 新增类型需修改现有代码 | 添加新类型需修改 switch | 使用接口+实现类 |
|
|
51
|
+
| 逻辑固定 | 业务规则硬编码 | 使用配置/规则引擎 |
|
|
52
|
+
|
|
53
|
+
**示例**:
|
|
54
|
+
```java
|
|
55
|
+
// ❌ 违反 OCP:新增支付方式需修改现有代码
|
|
56
|
+
public class PaymentService {
|
|
57
|
+
public void pay(String type) {
|
|
58
|
+
if (type.equals("ALIPAY")) { }
|
|
59
|
+
else if (type.equals("WECHAT")) { }
|
|
60
|
+
// 新增支付方式需修改此处
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// ✅ 符合 OCP:使用策略模式
|
|
65
|
+
public interface PaymentStrategy {
|
|
66
|
+
void pay();
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
public class AlipayStrategy implements PaymentStrategy { }
|
|
70
|
+
public class WechatStrategy implements PaymentStrategy { }
|
|
71
|
+
// 新增支付方式只需添加新实现类
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## L - Liskov Substitution Principle (里氏替换原则)
|
|
77
|
+
|
|
78
|
+
**定义**:子类必须能够替换其父类
|
|
79
|
+
|
|
80
|
+
| 检查项 | 问题信号 | 修复方案 |
|
|
81
|
+
|--------|----------|----------|
|
|
82
|
+
| 子类抛出新异常 | 父类不抛出,子类抛出 | 保持异常一致 |
|
|
83
|
+
| 子类返回不同类型 | 返回类型不兼容 | 保持返回类型一致 |
|
|
84
|
+
| 子类行为不一致 | 相同输入不同输出 | 保持行为一致 |
|
|
85
|
+
| 子类限制更强 | 子类拒绝父类接受的输入 | 放宽限制或重新设计 |
|
|
86
|
+
|
|
87
|
+
**示例**:
|
|
88
|
+
```java
|
|
89
|
+
// ❌ 违反 LSP:子类行为不一致
|
|
90
|
+
public class Rectangle {
|
|
91
|
+
public void setWidth(int w) { width = w; }
|
|
92
|
+
public void setHeight(int h) { height = h; }
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
public class Square extends Rectangle {
|
|
96
|
+
@Override
|
|
97
|
+
public void setWidth(int w) {
|
|
98
|
+
width = w;
|
|
99
|
+
height = w; // 强制宽高相等,行为不一致
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// ✅ 符合 LSP:不使用继承,使用组合
|
|
104
|
+
public class Shape { }
|
|
105
|
+
public class Rectangle extends Shape { }
|
|
106
|
+
public class Square extends Shape { }
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## I - Interface Segregation Principle (接口隔离原则)
|
|
112
|
+
|
|
113
|
+
**定义**:客户端不应该依赖它不需要的接口
|
|
114
|
+
|
|
115
|
+
| 检查项 | 问题信号 | 修复方案 |
|
|
116
|
+
|--------|----------|----------|
|
|
117
|
+
| 接口方法过多 | 接口方法数 > 10 | 拆分为多个接口 |
|
|
118
|
+
| 实现类空方法 | 实现类有空方法体 | 拆分接口 |
|
|
119
|
+
| 客户端只使用部分方法 | 客户端调用 < 50% 方法 | 拆分接口 |
|
|
120
|
+
| 接口职责混杂 | 接口包含不同职责方法 | 拆分接口 |
|
|
121
|
+
|
|
122
|
+
**示例**:
|
|
123
|
+
```java
|
|
124
|
+
// ❌ 违反 ISP:接口方法过多
|
|
125
|
+
public interface Worker {
|
|
126
|
+
void work();
|
|
127
|
+
void eat();
|
|
128
|
+
void sleep(); // Robot 不需要 sleep
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// ✅ 符合 ISP:接口拆分
|
|
132
|
+
public interface Workable {
|
|
133
|
+
void work();
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
public interface Feedable {
|
|
137
|
+
void eat();
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
public class Human implements Workable, Feedable { }
|
|
141
|
+
public class Robot implements Workable { }
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## D - Dependency Inversion Principle (依赖倒置原则)
|
|
147
|
+
|
|
148
|
+
**定义**:高层模块不应该依赖低层模块,两者都应该依赖抽象
|
|
149
|
+
|
|
150
|
+
| 检查项 | 问题信号 | 修复方案 |
|
|
151
|
+
|--------|----------|----------|
|
|
152
|
+
| 直接 new 对象 | Service 中 new Mapper() | 使用依赖注入 |
|
|
153
|
+
| 依赖具体类 | 依赖具体实现类 | 依赖接口/抽象类 |
|
|
154
|
+
| 硬编码依赖 | 依赖类型硬编码 | 使用配置/注入 |
|
|
155
|
+
|
|
156
|
+
**示例**:
|
|
157
|
+
```java
|
|
158
|
+
// ❌ 违反 DIP:Service 直接依赖具体 Mapper
|
|
159
|
+
public class OrderService {
|
|
160
|
+
private OrderMapper mapper = new OrderMapper(); // 直接 new
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// ✅ 符合 DIP:依赖注入
|
|
164
|
+
public class OrderServiceImpl implements OrderService {
|
|
165
|
+
private final OrderMapper mapper; // 注入抽象
|
|
166
|
+
|
|
167
|
+
public OrderServiceImpl(OrderMapper mapper) {
|
|
168
|
+
this.mapper = mapper;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## Anti-rationalization Table (Design)
|
|
176
|
+
|
|
177
|
+
| 常见借口 | 反驳理由 | 正确做法 |
|
|
178
|
+
|---------|---------|---------|
|
|
179
|
+
| "先实现功能,设计文档以后补" | 无文档的设计无法维护 | 先设计后实现 |
|
|
180
|
+
| "这个实体很简单,不需要设计" | 简单实体也会变复杂 | 完整设计 |
|
|
181
|
+
| "状态流转很直观,不用画图" | 直观的流转也有边界情况 | 绘制状态图 |
|
|
182
|
+
| "接口定义很清楚,不需要文档" | 清楚的定义也需要确认 | 编写API文档 |
|
|
183
|
+
| "这个依赖关系很简单" | 简单依赖也会产生循环 | 分析依赖图 |
|
|
184
|
+
| "SOLID检查太耗时" | 违反SOLID的代码更耗时维护 | 执行SOLID检查 |
|
|
185
|
+
| "这个功能单体和微服务都一样" | 架构差异影响设计决策 | 明确架构类型 |
|
|
186
|
+
| "这个类以后会扩展" | 未预留扩展点会导致修改 | 使用开闭原则 |
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## Verification Gates
|
|
191
|
+
|
|
192
|
+
| 门禁 | 检查方法 | 通过条件 | 失败处理 |
|
|
193
|
+
|------|---------|---------|---------|
|
|
194
|
+
| SRP检查 | 类职责分析 | 每个类职责单一 | 拆分类 |
|
|
195
|
+
| OCP检查 | 扩展点分析 | 新功能无需修改现有代码 | 添加扩展点 |
|
|
196
|
+
| LSP检查 | 子类行为测试 | 子类可替换父类 | 修复行为不一致 |
|
|
197
|
+
| ISP检查 | 接口方法数 | 接口方法 <= 10 | 拆分接口 |
|
|
198
|
+
| DIP检查 | 依赖分析 | 无直接 new 对象 | 使用依赖注入 |
|
|
199
|
+
| 用户确认 | 设计文档评审 | 用户确认设计 | 修改设计 |
|