From f4c829bf8d15ab087653e7c9d9e01fa023181570 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=A8=E8=90=BD=E5=9F=BA=E5=9B=B4=E8=99=BE?= <3161880837@qq.com> Date: Fri, 31 Jul 2026 13:44:39 +0800 Subject: [PATCH] docs: update and reorganize the project specification document MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. rename "命名规范" to "通用命名规范" 2. adjust the order of naming specification items 3. add code writing specification, pattern style and node reference related content --- SPEC.md | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/SPEC.md b/SPEC.md index 5ff7d88..939bc71 100644 --- a/SPEC.md +++ b/SPEC.md @@ -27,14 +27,13 @@ - Manager/ 管理器,一般要和节点树交互,也可以不交互 - [T]Manager.gd 类名就是class_name [T]Manager,只能继承Node(或者不继承),不能更深,否则请作为Statemachine -## 命名规范 +## 通用命名规范 1. 对于一切符号,用小驼峰命名法,就是写js用的那种,常量除外,采用全大写 2. 对于游戏内容[T extends Character|Bullet|Menu|...],其行为脚本的类名写成“内容名+[T]”,比如角色A的类名就是ACharacter -3. 对于节点,场景根节点写大驼峰,下面的树写小驼峰 -4. 对于资源文件,用连字符命名 -5. 对于脚本文件,大多数情况下可以直接写类名,但是游戏内容`[N][T]`也可以写成N.gd -6. 对于着色器文件,用小驼峰写清楚实现的特效是什么 +3. 对于资源文件,用连字符命名 +4. 对于脚本文件,大多数情况下可以直接写类名,但是游戏内容`[N][T]`也可以写成N.gd +5. 对于着色器文件,用小驼峰写清楚实现的特效是什么 ## 代码排序规范 @@ -67,6 +66,30 @@ 空行 5. 方法 +## 代码编写规范 + +1. 必须用静态类型声明,禁止动态类型或者是用`:=`的语法糖 +2. 少用`as`,如果你是已经确定一个对象的类型,但是编译器推不出来直接用if is,除非是编译器推断错了再用as +3. 对于节点名字或者Signal的名字,可以用`StirngName`特化性能,比直接用`Stirng`好一点 +4. 缩进用Tab,不要用空格 + +### 模式风格 + +1. 对于一个函数有多个返回值通过数组或者字典返回,可以用Pattern Match(match data:[var a,var b])来解构,就可以少一点变量了 +2. 保持函数的纯度,尽量多写纯函数,少点副作用 +3. 解耦,这个很好理解,就是把数据逻辑和UI逻辑分离开之类的 + +## 关于节点 + +### 引用 + +**注意**:我这里指的是狭义的`Node.get_node`方法或者`$`的速记写法。 + +- 节点的命名规范:**场景根节点用大驼峰,下面的树用小驼峰,虽然可以用中文和连字符以及一些乱七八糟的其他字符,但是最好还是不要出现,就用英文字母+数字**。 +- 在脚本里获取节点 + - 场景里原本就有的,仅唯一的节点,请给一个unique id,不要在@onready时用绝对路径获取,就是写成@onready var colorRect: ColorRect = $%colorRect + - 对于要出现很多次的节点,比如角色,那就不用unique id了,直接get_node + ## Best Practice 1. 所有直接继承Object或者没写继承的类不许去new,要么就继承RefCounted,不然会内存泄漏