Files

10 KiB
Raw Permalink Blame History

代码分析可视化工具 · 设计文档

面向 AI 生成的「大锅饭」代码,帮助开发者快速掌握有哪些模块、模块间关系如何,颗粒度到函数级;聚焦宏观流程打通,不做具体实现的 bug 排查。以流程图为核心展示,抽象出一套标准化报告数据结构,任何项目按此结构产出报告均可在工具内展示。


一、产品概述

  • 1.1 背景与问题(AI 大锅饭代码难以掌握全貌)
  • 1.2 目标用户与典型使用场景
  • 1.3 核心价值主张
  • 1.4 范围与非目标(只讲宏观模块与流程,不做 bug 检测 / 代码质量评审)
  • 1.5 术语表

二、核心设计理念

  • 2.1 以流程图为核心的展示范式
  • 2.2 模块 → 函数 两级颗粒度
  • 2.3 报告即数据(标准化数据结构驱动展示)
  • 2.4 项目无关性(跨语言 / 跨框架 / 跨规模)

三、标准化代码报告数据结构(核心 Schema)

3.0 设计原则

  • 聚焦原汁原味的逻辑:核心是函数以及函数之间的调用关系,不纠结语言特性。
  • 不区分语言细节class / struct / interface 统一抽象成「容器 Container」,只负责持有函数与字段;不处理继承、可见性、抽象等语法概念。
  • 扁平存储 + ID 引用:所有实体平铺存放,用 id 互相引用(如容器用 functionIds 持有函数,函数用 ownerId 回指容器),便于图渲染、跨模块跳转与下钻。
  • 统一边模型:调用、导入、引用、触发、数据流等所有关系归一为一种 Edge,作为关系的唯一真相源;函数上不再冗余存调用列表。
  • 来源可追溯:每个实体/边带 provenance,区分「AST 确定的结构」与「AI 推断的解读」(尤其业务流程)。

3.1 基础通用类型

type Id = string;

// 实体/边的来源:ast=语法确定, resolved=引用解析, ai=模型推断, manual=人工
type Provenance = "ast" | "resolved" | "ai" | "manual";

interface SourceLocation {
  file: string;        // 相对仓库根的路径
  startLine: number;
  endLine: number;
  startCol?: number;
  endCol?: number;
}

// 所有实体的公共字段
interface BaseEntity {
  id: Id;
  name: string;
  qualifiedName?: string;              // 完全限定名,如 server/TaskRepo.create
  location?: SourceLocation;
  language?: string;
  provenance: Provenance;
  confidence?: number;                 // 0~1,启发式解析时使用
  summary?: string;                    // 一句话职责(可由 AI 生成)
  tags?: string[];
  extra?: Record<string, unknown>;     // 场景/语言专属扩展位
}

3.2 模块 Module

模块 = 目录 / 包 / 逻辑分组,可嵌套成树,是宏观视图的分层单位。

interface Module extends BaseEntity {
  kind: "module";
  parentId?: Id;
  childModuleIds: Id[];
  fileIds: Id[];
  path?: string;
}

3.3 文件 File

interface CodeFile extends BaseEntity {
  kind: "file";
  moduleId: Id;
  path: string;
  loc?: number;                        // 行数
  containerIds: Id[];                  // 本文件定义的容器(类/结构等)
  functionIds: Id[];                   // 本文件的顶层函数
}

3.4 容器 Container(类 / 结构 等的统一抽象)

不区分 class / struct / interface,只作为函数与字段的持有者。

interface Container extends BaseEntity {
  kind: "container";
  fileId: Id;
  moduleId?: Id;
  functionIds: Id[];                   // ← 持有的函数(方法)
  fieldIds: Id[];                      // ← 持有的字段/属性
}

3.5 函数 Function(核心)

顶层函数与容器方法统一用一个结构;是否为方法由 ownerId 区分。函数之间的调用关系不存在这里,而是统一走 Edge

interface Func extends BaseEntity {
  kind: "function";
  fileId: Id;
  ownerId?: Id;          // 若为方法,指向所属容器;顶层函数留空
  moduleId?: Id;
  signature?: string;    // 原始签名文本
  params: Param[];
  returnType?: string;
  isEntry?: boolean;     // 是否入口点(main / 路由处理器 / 事件回调)
  interactions?: Interaction[];  // ← 该函数的跨边界交互(前后端协议 / 数据库)
  loc?: number;
}

interface Param {
  name: string;
  typeRef?: string;      // 声明类型(文本即可,不强求解析)
  optional?: boolean;
  defaultValue?: string;
}

跨边界交互 Interaction

理解宏观逻辑的关键,往往不在于「函数调了谁」,而在于它越过了哪条系统边界:前端发往后端的一次请求、后端打到数据库的一次读写。这类信息直接作为函数的属性挂在函数上,而非独立节点。外部系统清单(用到哪些数据库 / 外部服务)可由全部函数的 interactions 聚合派生,无需单独维护。

type InteractionKind = "api" | "db";          // 可扩展:mq / cache / rpc ...

// in  = 对外暴露 / 被外部调用(如接口处理器)
// out = 本函数主动发起(如发请求 / 查库)
type InteractionDirection = "in" | "out";

interface InteractionBase {
  id: Id;
  direction: InteractionDirection;
  provenance: Provenance;
  confidence?: number;
  summary?: string;
}

// 前后端协议交互
interface ApiInteraction extends InteractionBase {
  kind: "api";
  protocol: "http" | "ws" | "rpc" | "graphql";
  method?: string;       // GET / POST / ...http
  path?: string;         // 如 /api/tasks/:id
  peer?: string;         // 对端:前端页面 / 外部服务名(若可知)
}

// 数据库交互
interface DbInteraction extends InteractionBase {
  kind: "db";
  operation: "read" | "create" | "update" | "delete" | "other";
  target?: string;       // 表 / 模型 / 集合名
  engine?: string;       // postgres / mysql / mongo ...(可选)
}

type Interaction = ApiInteraction | DbInteraction;

3.6 字段 Field

interface Field extends BaseEntity {
  kind: "field";
  ownerId: Id;           // 所属容器
  typeRef?: string;
}

3.7 关系 Edge(统一边模型,关系的唯一真相源)

type EdgeKind =
  | "call"        // 函数调用(Call-Flow 的原子)
  | "import"      // 文件/模块导入
  | "reference"   // 一般引用/使用
  | "dataflow"    // 数据流(可选,后期)
  | "trigger";    // 触发:路由→处理器、事件→回调

interface Edge {
  id: Id;
  kind: EdgeKind;
  sourceId: Id;          // 起点实体 id
  targetId: Id;          // 终点实体 id(未解析时指向占位节点)
  provenance: Provenance;
  confidence?: number;
  label?: string;
  extra?: Record<string, unknown>;
}

3.8 流程 FlowCall-Flow 与 Business-Flow 同结构)

interface Flow {
  id: Id;
  name: string;
  flowType: "call" | "business";   // 调用链 / 业务流程
  summary?: string;
  provenance: Provenance;          // call 多为 resolvedbusiness 多为 ai/manual
  entryNodeId?: Id;
  steps: FlowStep[];
  edgeIds?: Id[];                  // 关联到结构层的底层调用边,支持回溯
}

interface FlowStep {
  id: Id;
  order: number;
  nodeId?: Id;                     // 指向某函数/容器/模块
  title: string;
  description?: string;
  branchLabel?: string;            // 分支条件文字
  nextStepIds: Id[];               // 支持分支/汇合
}

3.9 外部系统 ExternalSystem(由交互派生)

外部系统不再作为原始录入节点,而是由聚合全部函数的 interactions 派生得到,作为报告里的物化视图供展示消费:

  • db 交互的 engine / target 去重 → 数据库系统及其数据表清单;
  • out 方向的 api 交互的 peer / path 去重 → 依赖的外部服务清单。

每个外部系统都回指与之交互的函数,保证可回溯。

type ExternalSystemKind = "database" | "service";

interface ExternalSystemBase {
  id: Id;
  kind: ExternalSystemKind;
  name: string;                 // 数据库/引擎名 或 外部服务名
  functionIds: Id[];            // 与之交互的函数(回溯来源)
  interactionCount: number;     // 交互次数
  provenance: Provenance;       // 派生结果,通常为 resolved
}

// 数据库系统
interface DatabaseSystem extends ExternalSystemBase {
  kind: "database";
  engine?: string;              // postgres / mysql / mongo ...
  tables: string[];             // 去重后的表 / 模型清单
}

// 外部服务
interface ServiceSystem extends ExternalSystemBase {
  kind: "service";
  protocol?: string;            // http / ws / rpc / graphql
  endpoints: string[];          // 去重后的 path / peer 清单
}

type ExternalSystem = DatabaseSystem | ServiceSystem;

3.10 顶层报告 Report

interface Report {
  schemaVersion: string;
  project: {
    name: string;
    root: string;
    languages: string[];
    generatedAt: string;
    generator?: string;            // 生成工具 / 版本
  };
  stats: {
    fileCount: number;
    containerCount: number;
    functionCount: number;
    edgeCount: number;
    loc?: number;
  };
  modules:    Module[];
  files:      CodeFile[];
  containers: Container[];
  functions:  Func[];
  fields:     Field[];
  edges:      Edge[];
  flows:      Flow[];
  externalSystems?: ExternalSystem[];   // 由 interactions 派生的物化视图(可选缓存)
}

3.11 持有关系总览

flowchart TD
    Report --> Module
    Module --> CodeFile
    CodeFile --> Container
    CodeFile --> Func
    Container -->|functionIds| Func
    Container -->|fieldIds| Field
    Func -->|interactions| Interaction
    Report -->|"call/import/..."| Edge
    Report --> Flow
    Flow -->|steps.nodeId| Func
    Edge -->|source/target| Func

四、可视化展示设计

  • 4.1 整体架构图(分层视图)
  • 4.2 模块关系图(依赖 / 引用)
  • 4.3 流程图 · 核心视图(Call-Flow / Business-Flow 同画布切换)
  • 4.4 函数级调用图(下钻视图)
  • 4.5 源码目录结构树
  • 4.6 数据模型 ER 图
  • 4.7 交互能力(缩放 / 下钻 / 搜索 / 高亮 / 跳转 / 联动)
  • 4.8 多视图切换与状态同步

五、报告生成与接入方式

  • 5.1 手工编辑
  • 5.2 AI 辅助分析生成
  • 5.3 静态解析工具导入
  • 5.4 报告导入 / 导出格式

六、软件架构与技术选型

  • 6.1 整体架构
  • 6.2 前端渲染方案(图形库选型)
  • 6.3 数据加载与存储
  • 6.4 部署形态

七、界面与页面结构

  • 7.1 报告列表 / 项目切换
  • 7.2 主画布与侧边面板
  • 7.3 详情抽屉与检索

八、里程碑与迭代计划