Files
chill_notes/AI工程/概念/技术规格DSL.md
2026-06-22 11:30:51 +08:00

5.5 KiB
Executable File
Raw Blame History

技术规格DSL

相关:规格驱动开发Harness工程上下文体系

定义

技术规格DSLDomain Specific Language是使用领域特定语言编写技术规格的方法包括领域模型、数据库、API、时序图等。

核心思想使用DSL驱动技术规格保证一致性和可执行性。

5个模块

模块 表达标准 格式 产出内容 约束/规范
领域模型 PlantUML/Smart Domain .puml 实体、属性、关系 必须表达实体关系;字段需与数据库一致
数据库 SQL DDL/DBML/Flyway .sql 表结构、索引、约束 必须可执行;包含索引和外键
API OpenAPI 3.x .yaml/.json 接口定义、请求/响应 必须定义schema字段与模型一致
时序图 PlantUML .puml 调用流程、系统交互 必须反映真实调用链;包含异常分支
专题设计 Markdown .md 架构策略 只写策略与规则;强调设计决策

领域模型

PlantUML示例

@startuml
entity User {
  * id : Long <<PK>>
  --
  * username : String(50)
  * email : String(100)
  * role_id : Long <<FK>>
}

entity Role {
  * id : Long <<PK>>
  --
  * name : String(20)
}

User }o--|| Role : "拥有"
note right of User : 聚合根
@enduml

约束要求

  • 必须表达实体关系1:1, 1:N, M:N
  • 字段需与数据库一致
  • 标注聚合关系

数据库设计

SQL DDL示例

-- Flyway migration: V1__create_users_table.sql
CREATE TABLE users (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL,
    role_id BIGINT NOT NULL,
    status TINYINT(1) DEFAULT 1,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    INDEX idx_username (username),
    INDEX idx_email (email),
    CONSTRAINT fk_user_role FOREIGN KEY (role_id) REFERENCES roles(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

约束要求

  • 必须可执行
  • 使用Flyway/Liquibase管理版本
  • 包含索引和外键

API设计

OpenAPI 3.x示例

openapi: 3.0.3
info:
  title: User API
  version: 1.0.0
paths:
  /api/v1/users:
    post:
      summary: 创建用户
      tags: [User]
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateUserRequest'
      responses:
        '201':
          description: 创建成功
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UserResponse'
components:
  schemas:
    CreateUserRequest:
      type: object
      required: [username, email, password]
      properties:
        username:
          type: string
          minLength: 3
          maxLength: 50
        email:
          type: string
          format: email
        password:
          type: string
          minLength: 8

约束要求

  • 必须定义schema
  • 禁止只写接口说明
  • 字段与领域模型一致

时序图

PlantUML时序图示例

@startuml
actor User
participant "UserController" as C
participant "UserService" as S
participant "UserRepository" as R
database "MySQL" as DB

User -> C: POST /api/v1/users
C -> C: 参数校验
C -> S: createUser(CreateUserRequest)
S -> S: 业务规则校验
S -> R: save(User)
R -> DB: INSERT INTO users ...
DB --> R: 返回结果
R --> S: 返回 User
S --> C: 返回 UserResponse
C --> User: 201 Created

alt 用户名已存在
  S --> C: throw DuplicateException
  C --> User: 409 Conflict
end
@enduml

约束要求

  • 必须反映真实调用链
  • 建议包含异常分支alt
  • 标注关键步骤

专题设计

示例

# 权限设计方案

## 策略
- 使用RBAC基于角色的访问控制
- 权限注解:@RequirePermission("user:create")
- 默认拒绝所有未授权的请求

## 规则
1. 管理员角色拥有所有权限
2. 普通用户只能操作自己的数据
3. 敏感操作需要二次确认

## 设计决策
- 选择RBAC而非ABAC业务场景简单角色固定
- 权限存储在Redis减少数据库查询

约束要求

  • 只写"策略与规则"
  • 不重复API/DDL
  • 强调设计决策

为什么用DSL

  • 可执行DDL可以直接运行OpenAPI可以生成代码
  • AI友好LLM对DSL的理解比自然语言更精确
  • 一致性保证DSL有语法规则不容易产生歧义

适用场景

  • 复杂项目:需要完整的技术规格
  • 团队协作:需要统一的技术规范
  • AI辅助开发:需要精确的技术规格

优势

  • 一致性领域模型、数据库、API保持一致
  • 可执行部分DSL可以直接执行
  • AI友好AI可以精确理解DSL
  • 可维护DSL可以版本化

挑战

  • 学习成本需要学习多种DSL
  • 维护成本需要保持DSL的一致性
  • 工具支持:需要相应的工具支持

最佳实践

  1. 使用DSL:统一技术规格的表示方式
  2. 保持一致性领域模型、数据库、API要一致
  3. AI辅助生成让AI根据规格生成代码
  4. 版本控制技术规格纳入Git管理

相关概念