设计规范
字段设计
常量字段concept
每个树节点,都有一个常量字段concept
,和类名保持一致。用于取到任意局部 JSON,快速实例化。如:
{
"concept": "Variable",
"name": "param1",
"description": "",
"typeAnnotation": null,
"defaultValue": null
}
deprecated
代替以前的level
和type
字段。
树节点本身不存储标识上下文类型的字段
为了提高树节点的复用性,树节点本身不存储标识上下文类型的字段。
如果需要判断时,根据 parentNode 的 concept 去判断。如:
node.parentNode.concept === 'View'
deprecated
去除以前类似serviceType('view' | 'microService' | 'process')
、moduleType
等字段
树节点本身尽量不存储是否可编辑字段
树节点本身是否可编辑其实是由上下文决定的。
比如某个逻辑不可编辑,是由于它是扩展模块下的子节点。
开发时可以用一个getter
来实现。如:
get readonly() {
return this.module.type === 'extension';
}
deprecated
优先不用editable
、removable
等字段。
用xxxNamespace
和xxxName
确定引用意图
用xxxNamespace
和xxxName
两个字段确定引用意图,如:
{
"concept": "TypeAnnotation",
"typeKind": "primitive",
"typeNamespace": "app.structures",
"typeName": "StudentResult",
"typeArguments": null,
"inferred": null
}
{
"concept": "CallLogic",
"label": "调用逻辑",
"calleeNamespace": "app.logics",
"calleeName": "logic1",
"shortcut": null,
"arguments": []
}
deprecated
代替以前的$ref
、schemaRef
、calleeCode
、joinPartRef
等字段
开发时可以用一个getter
来确定唯一标识,用于 Select 高亮等场景。如:
get calleeKey() {
return `${this.calleeNamespace}.${this.calleeName}`;
}
字段命名
数组类型的字段名统一用复数词汇表示,而不用${单数词汇}List
的形式
// ✗ bad
propertyList
enumItemList
indexList
propertyNameList
joinPartList
onExpressionList
selectElementList
attrList
eventList
directiveList
// ✓ good
properties
enumItems
indexes
propertyNames
joinParts
onExpressions
selectElements
bindAttrs
bindEvents
bindDirectives
Map 类型的字段名统一用${单数词汇}Map
表示,而不用复数词汇
// ✗ bad
themeVariables
externalDependencies
// ✗ bad
themeVariablesMap
externalDependenciesMap
// ✓ good
themeVariableMap
externalDependencyMap
优先使用已定义的常用字段
concept
: 产品概念,id
: {className} Id,createdBy
: 创建者,createdTime
: 创建时间,updatedBy
: 修改者,updatedTime
: 修改时间,changedBy
: 变动者,changedTime
: 变动时间,ideVersion
: IDE 版本,editable
: 是否可编辑,name
: {className}名称,title
: {className}标题,label
: {className}标题,description
: {className}描述,group
: {className}分组,value
: {className}的值,code
: {className}的代码,
尽量不要使用缩写
已使用的在这里备注:
parameter
: 'param',attributes
: 'attrs',bindAttributes
: 'bindAttrs',
字段值
value 表达统一用类输入框字符串
在树节点中表示 value 的情况统一用字符串,如变量的defaultValue
、字面量的value
和绑定属性的value
等。
表现与<input>
输入框类似,如果上下文表达的类型为字符串,那么就是它本身;如果语义为其他类型,需要按情况 parse(一般为 JSON.parse)
这样的好处是,用户可编辑的时候正好为输入框中的值,存储时不需要做额外处理。
下面举几个例子:
示例一:字符串字面量
{
"concept": "StringLiteral",
"value": "Hello World!"
}
而不是
caution
{
"concept": "StringLiteral",
"value": "\"Hello World!\""
}
示例二:数字字面量
但数字是用
{
"concept": "NumericLiteral",
"value": "123",
"typeAnnotation": null
}
而不是
caution
{
"concept": "NumericLiteral",
"value": 123,
"typeAnnotation": null
}
示例三:输入参数默认值
{
"concept": "Param",
"name": "param1",
"description": "",
"typeAnnotation": {
"concept": "TypeAnnotation",
"typeKind": "primitive",
"typeNamespace": "nasl.core",
"typeName": "Integer",
"typeArguments": null,
"inferred": null
},
"required": true,
"defaultValue": "123"
}
示例四:绑定属性值
{
"concept": "BindAttribute",
"name": "text",
"type": "string",
"value": "按钮文本",
"expression": null,
"destination": null
}
类设计
明确区分声明与使用
声明(Declaration) | 使用(Using) | 使用类型(主要引用/调用/new/传参) |
---|---|---|
Structure(数据结构) | Variable.typeAnnotation(类型标识) | 引用 |
Enum(枚举) | Variable.typeAnnotation(类型标识) | 引用 |
Logic(逻辑) | CallLogic(调用逻辑) | 调用 |
Function(函数) | CallFunction(调用函数) | 调用 |
Interface(接口) | CallInterface(调用接口) | 调用 |
View(页面) | Destination(跳转页面) | 引用 |
Param(形式参数) | Argument(实际参数) | 传参 |
TypeParam(形式类型参数) | typeArgument(实际类型参数) | 传参 |
暂时没有 | LogicItem(逻辑节点) | |
ViewComponent | ViewElement(页面节点) | new |
ProcessComponent | ProcessElement(流程节点/边) | new |
Attribute(属性定义) | BindAttribute(绑定属性) | 传参 |
Event(事件定义) | BindEvent(绑定事件) | 传参 |