--- name: zhouyilab-modules description: 在 ZhouYiLab 新增或重构 C++23 模块、分析入口与公共契约时规范分层、依赖和 cppm/cpp 组织。 --- ## 模块组织与依赖 - 普通功能模块采用同目录、同名的 `xxx.cppm` 接口和 `xxx.cpp` 实现。接口写 `export module`、必要的 `import`、导出类型及函数声明;实现写同名 `module`、实现依赖和函数定义。禁止把算法、报告拼装、大型规则表全部堆进接口。 - 纯枚举/结构契约、纯重导出入口不强造空 `.cpp`。模板及确实需要导入者在编译期求值的 `constexpr` 定义可保留在接口,并说明原因;其他普通函数不要习惯性添加 `constexpr`。禁止接口声明 `constexpr`、实现单元才定义的跨模块接口。 - 公开签名直接导入其类型所属模块,必要时使用完整类型限定;不能依赖别的控制器的 `using` 或偶然的传递可见性。`export namespace` 内声明已导出,不机械重复添加 `export`。 - `export import` 只用于有意重导出的公共契约/门面;内部依赖普通 `import`。头文件如必须引入,应放在合法的全局模块片段,避免将标准库或第三方声明意外附着到命名模块。 - `.cppm` 只进入目标的一个 `CXX_MODULES` file set;对应 `.cpp` 作为普通源参与构建。拆分后核对声明、定义、调用方 import、CMake 收录和链接,避免漏编译实现或重复定义。 ## 各层职责 | 层 | 职责 | 不得承担 | | --- | --- | --- | | `src/common/` | 干支、五行、藏干、历法、时间、卦序等共用基础 | 流派判断、控制器依赖、报告拼装 | | `src/<术数>/` 排盘模块 | 依据输入生成该术数盘局 | 面向某流派的取用、输出文件 | | `analysis/*contract.cppm` | 请求、结果、规则依据等领域契约 | 运行分析、终端输出、大型实现 | | `analysis/` 规则模块 | 根据排盘推演,产出结构化结论及依据 | 重写共用干支表、文件 I/O | | `*controller` | 校验与用例编排,选择排盘/分析入口 | 中文表格、JSON 字段拼装、打印 | | `*presenter` / `*report` | 从排盘与分析结果渲染中文/结构化报告 | 再算一遍规则、修改原局结论 | | `examples/`、应用入口 | 调用控制器与展示模块、选择输出路径 | 定义另一套排盘/分析算法 | 依赖由应用和展示指向契约、分析、排盘及基础层,基础层不得反向导入高层。共享契约不得反向依赖分析器或展示实现。 ## 拆分与设计模式 - 按稳定职责拆分原局、关系、取用/做功、岁运、应期、展示;先查找现有模块再决定新增,不能仅因文件长便切成无语义的 `part1/part2`。 - 流派选择采用统一门面入口加策略分派;子平与盲派各自保持契约和实现。规则执行可采用明确的分阶段流水线;静态规则适合枚举键和定义表。没有扩展需求时不要为展示设计模式堆叠虚基类、工厂和单例。 - 大契约按消费者及语义内聚性拆为子契约,再由小入口重导出;共用类型只有一个定义来源,避免循环导入和为方便复制 enum/struct。