@chengzhao-dev/dsh-cpp-workflow 0.6.13 → 0.6.15
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/README.en.md +2 -2
- package/README.md +2 -2
- package/package.json +1 -1
- package/skills/building-cpp/SKILL.md +18 -16
- package/skills/building-cpp/references/build-script.md +4 -4
- package/skills/building-cpp/references/static-analysis.md +1 -1
- package/skills/building-cpp/steps/02-tooling.md +2 -2
- package/skills/building-cpp/steps/03-check.md +4 -3
- package/skills/configuring-cmake/SKILL.md +17 -17
- package/skills/configuring-cmake/steps/03-check.md +2 -2
- package/skills/developing-cpp/SKILL.md +13 -13
- package/skills/developing-cpp/examples/comments-declaration.md +22 -27
- package/skills/developing-cpp/examples/comments-implementation.md +1 -1
- package/skills/developing-cpp/examples/exceptions.md +2 -2
- package/skills/developing-cpp/examples/naming.md +1 -8
- package/skills/developing-cpp/examples/structure.md +12 -12
- package/skills/developing-cpp/references/change-model.md +55 -0
- package/skills/developing-cpp/references/comments.md +38 -21
- package/skills/developing-cpp/references/declaration-order.md +1 -1
- package/skills/developing-cpp/references/exceptions.md +4 -4
- package/skills/developing-cpp/references/glossary.md +1 -1
- package/skills/developing-cpp/references/google-cpp-style.md +4 -21
- package/skills/developing-cpp/references/language.md +2 -2
- package/skills/developing-cpp/references/layout.md +4 -13
- package/skills/developing-cpp/references/naming.md +2 -2
- package/skills/developing-cpp/references/performance.md +2 -1
- package/skills/developing-cpp/references/priority.md +3 -1
- package/skills/developing-cpp/references/project-design.md +2 -2
- package/skills/developing-cpp/scripts/checking-comments.mjs +5 -0
- package/skills/developing-cpp/steps/01-behavior.md +10 -10
- package/skills/developing-cpp/steps/02-boundary.md +17 -19
- package/skills/developing-cpp/steps/03-declaration.md +20 -13
- package/skills/developing-cpp/steps/04-implementation.md +16 -16
|
@@ -6,26 +6,33 @@
|
|
|
6
6
|
|
|
7
7
|
## 通用情况
|
|
8
8
|
|
|
9
|
-
- 语言标准由项目声明决定,新工程默认 C++23
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
- `
|
|
9
|
+
- 语言标准由项目声明决定,新工程默认 C++23(C++11–C++23);`environment.json` 的 `standard` 是唯一来源。
|
|
10
|
+
- 文件槽位、包含守卫与扩展名以 `references/file-template.md` 为准;本步只决定声明写什么。
|
|
11
|
+
- 命名以 `references/naming.md` 为准:规则表、语义角色、谓词与查询命名都在那里。
|
|
12
|
+
- 声明顺序以 `references/declaration-order.md` 为准:类型 → 静态常量 → 工厂 → 构造/赋值/析构 → 其他函数 → 数据成员。
|
|
13
|
+
- 公共头自包含:自己用到的类型、宏和标准库头都直接包含。
|
|
14
|
+
- 单参数构造函数写 `explicit`;查询成员函数尾部写 `const`;返回结果对象的 API 加 `[[nodiscard]]`,标注位置与 `friend` 的例外见 `references/types.md`;默认成员初始化写在声明处。
|
|
15
|
+
- 头文件只就地定义约 10 行以内的短函数;模板与 `constexpr` 例外,其余函数体在 `.cpp`。
|
|
16
|
+
- 失败是调用方的正常结果时,用结果类型、`bool` + 输出参数或 `std::optional` 表达;函数无法完成自己的任务、或构造函数无法建立不变量时才抛,异常类型的选择与消息见 `references/exceptions.md`。
|
|
17
|
+
- 一次操作有多种必须区分的正常结果时用 `enum class` 返回(如落子:成功、越界、类型非法、已占),不用 `bool` 把原因压掉;成功还要附带数据时再考虑 `std::expected` 或结果结构。纯查询谓词仍用 `bool`。
|
|
18
|
+
- 声明注释按 `references/comments.md` 的四节写:类型注释、特殊成员、函数注释、数据成员。本步只决定「写哪些事实」:结果、失败方式、检查项、参数与返回值契约;句式、标签、宽度和示例由该文件定。
|
|
19
|
+
- 组合消息用 `std::format`;声明里只承诺 `std::format`,`std::print` 是 C++23 的程序边界设施。
|
|
19
20
|
|
|
20
21
|
## 情况
|
|
21
22
|
|
|
22
23
|
**新增类型**:先判断是聚合 `struct`、有不变量的 `class`,还是 `enum class`;接口多于数据且有 invariant 时用 `class`,纯数据传递用 `struct`。
|
|
23
24
|
|
|
24
|
-
|
|
25
|
+
**改公共接口**:先找所有调用方;改签名、改返回类型、改异常声明都算破坏性变更。能加默认参数或重载时优先加,不静默改变旧调用的含义。
|
|
25
26
|
|
|
26
|
-
**异常声明**:构造函数、`Get` 类查询、解析函数最容易抛;在声明注释里写「当……时抛出 `std::out_of_range
|
|
27
|
+
**异常声明**:构造函数、`Get` 类查询、解析函数最容易抛;在声明注释里写「当……时抛出 `std::out_of_range`」这样的具体类型,不给每个参数错误新建类型。
|
|
27
28
|
|
|
28
|
-
**注释**:声明注释用 `///`
|
|
29
|
+
**注释**:声明注释用 `///` 写中文散文,只写调用方需要知道的事实,实现细节留给 `.cpp`。文件头、标签、参数完整性与设计论证的规则见 `references/comments.md`。写完运行:
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
node "<skill-dir>/scripts/checking-comments.mjs" --root <项目根>
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
关闭 `@brief` 时加 `--no-brief`;配置里打开了隐私标签并填了值时加 `--allow-tag <标签>`。
|
|
29
36
|
|
|
30
37
|
## 正反例指针
|
|
31
38
|
|
|
@@ -2,43 +2,43 @@
|
|
|
2
2
|
|
|
3
3
|
## 产出
|
|
4
4
|
|
|
5
|
-
`.cpp` 实现文件中的函数体、操作顺序、分组空白和实现注释。实现只兑现第 1 步的行为和第 3
|
|
5
|
+
`.cpp` 实现文件中的函数体、操作顺序、分组空白和实现注释。实现只兑现第 1 步的行为和第 3 步的声明;需要新增公共接口时回到第 3 步。
|
|
6
6
|
|
|
7
7
|
## 通用情况
|
|
8
8
|
|
|
9
|
-
-
|
|
10
|
-
- 按「准备 → 操作 →
|
|
11
|
-
- `.cpp` 的第一个 include
|
|
12
|
-
-
|
|
13
|
-
- 什么时候在 `if`
|
|
14
|
-
-
|
|
9
|
+
- 函数保持短小,一个函数只做一件事。超过约 40 行时先找可以命名的中间步骤,不靠注释把长函数切成几段。
|
|
10
|
+
- 按「准备 → 操作 → 收尾」排列语句,用空行分组;组与组之间的空行表达阶段。
|
|
11
|
+
- `.cpp` 的第一个 include 是自己的配对头,然后直接包含本文件用到的标准库头,不依赖公共头转发声明。包含顺序见 `references/google-cpp-style.md`,文件槽位见 `references/file-template.md`。
|
|
12
|
+
- 函数体注释用 `//`,不用 `///`:体内 `///` 会接到该函数的 Doxygen 详细说明后面。重要函数按空行分阶段,每个阶段上方写一句 `//`,写这一支的后果,可以点明处理了哪些枚举值,不逐词翻译下一行的条件;`//` 里的枚举值不加反引号。单表达式函数(如 `IsFull`)不配注释。只写删掉会让下一次修改得到错误结果、而代码本身看不出的内容;变更史留给提交说明。
|
|
13
|
+
- 什么时候在 `if` 上方加一句:多条独立拒绝(如 `CheckPlaceable`)每个 `if` 一句;成功写入前一句;只有次序依赖的一对 `if` 在第一个上方说明;循环上方已有阶段说明时,循环里的 `if` 不再加;单表达式谓词不加。
|
|
14
|
+
- 失败是调用方正常结果时返回结果类型、`bool` 或 `std::optional`;函数无法完成自己的任务时抛异常,不拿异常做正常分支。Debug 与 Release 用同一套返回值与抛出条件,只有诊断详略不同。两种模式都要守的不变量用 `Check`(项目保留时),只在开发期做的自检用 `DebugCheck`;项目没有这两个宏时分别用 `assert` 与 `std::terminate`。捕获时按 `const` 引用,只处理能处理的类型,其余继续抛。异常类型、消息格式与「不抛的边界」见 `references/exceptions.md`。
|
|
15
15
|
- 声明 `noexcept` 前核对函数体:出现 `at()` 或其他可能抛出的调用就去掉。越界用 `at()` 抛 `std::out_of_range`,这个函数就不能标 `noexcept`。
|
|
16
|
-
- 组合输出用 `std::format`,再写入 `std::cout` / `std::cerr
|
|
17
|
-
-
|
|
16
|
+
- 组合输出用 `std::format`,再写入 `std::cout` / `std::cerr`;库实现里不直接打印。C++23 且库支持时程序边界可用 `std::print`,C++20 及更早没有。
|
|
17
|
+
- 转换用具名转换 `static_cast` / `std::bit_cast`,不用 C 风格强制转换。
|
|
18
18
|
- 所有权用 `std::unique_ptr`;没有共享所有权的理由时不用 `std::shared_ptr`。
|
|
19
19
|
- 只改注释时,不改可观察行为;只改实现时,不改公共声明。两者同时需要时,先改声明,再改实现。
|
|
20
|
-
- 清空成员数组:元素类型提供收回空取值的函数时(如 `Cell::Clear`),容器的 `Clear` 逐个调用它;没有这种函数时才用 `std::ranges::fill(cells_ | std::views::join, kEmpty)` 或 `for`
|
|
20
|
+
- 清空成员数组:元素类型提供收回空取值的函数时(如 `Cell::Clear`),容器的 `Clear` 逐个调用它;没有这种函数时才用 `std::ranges::fill(cells_ | std::views::join, CellState::kEmpty)` 或 `for` 循环逐格赋空值。两种写法都不直接写 `cells_ = {}`,也不从外部把枚举赋成空值。
|
|
21
21
|
- 默认构造只做「建立初值」时用成员初值(如 `cells_{}`),不在构造函数里再调一遍 `Clear()`;`Clear()` 只负责把已经写入的元素收回空。
|
|
22
22
|
|
|
23
23
|
## 情况
|
|
24
24
|
|
|
25
|
-
**新实现**:先写最短的直路,让第 1
|
|
25
|
+
**新实现**:先写最短的直路,让第 1 步的验收通过;同样的代码重复出现两次以上再抽函数,不预埋未使用的抽象。
|
|
26
26
|
|
|
27
27
|
**修缺陷**:先加一个能复现的测试或最小输入,再改实现;修完删掉临时调试输出,保留测试。
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
**重构**:一次只动一种东西(改名、抽函数、换容器),每步都让测试保持绿色,行为句不变。
|
|
30
30
|
|
|
31
|
-
**异常边界**:库内部让异常向上传播;程序入口捕获 `std::exception`(或项目自己的异常基类),用 `std::format("错误: {}", error.what())`
|
|
31
|
+
**异常边界**:库内部让异常向上传播;程序入口捕获 `std::exception`(或项目自己的异常基类),用 `std::format("错误: {}", error.what())` 打印,返回项目约定的非零退出码。不吞掉异常后继续使用无效状态。
|
|
32
32
|
|
|
33
33
|
## 交回构建
|
|
34
34
|
|
|
35
|
-
|
|
35
|
+
实现改完,按顺序交给下游:需要新增或移动源文件时,先由 `configuring-cmake` 的 `steps/01-targets.md` 把文件显式写进 target;target 齐了再由 `building-cpp` 的 `steps/01-build.md` configure、构建,最后走 `steps/03-check.md`。不要只改完函数体就宣称完成。
|
|
36
36
|
|
|
37
37
|
## 正反例指针
|
|
38
38
|
|
|
39
39
|
- 实现注释复述代码、分组混乱:`examples/comments-implementation.md`「实现注释」。
|
|
40
|
-
- 已经证明非负的坐标把下标收成 `std::size_t` 再 `[]
|
|
41
|
-
- 越界消息的标签取自调用点:`references/exceptions.md`「消息」的 `std::source_location`
|
|
40
|
+
- 已经证明非负的坐标把下标收成 `std::size_t` 再 `[]`,不转成 `int`:`references/types.md`「下标与越界」。
|
|
41
|
+
- 越界消息的标签取自调用点:`references/exceptions.md`「消息」的 `std::source_location` 用法。
|
|
42
42
|
- 为了保住 `noexcept` 再包一层只转发下标的私有函数:`references/exceptions.md`「不抛的边界」。
|
|
43
43
|
- 异常类型与结果类型混用:`examples/exceptions.md`「什么时候抛」。
|
|
44
44
|
- `std::format` 与流输出混用得当:`examples/exceptions.md`「异常类型与消息」。
|