Skip to main content
Version: 3.8

设计规范

字段设计

常量字段concept

每个树节点,都有一个常量字段concept,和类名保持一致。用于取到任意局部 JSON,快速实例化。如:

{
"concept": "Variable",
"name": "param1",
"description": "",
"typeAnnotation": null,
"defaultValue": null
}
deprecated

代替以前的leveltype字段。

树节点本身不存储标识上下文类型的字段

为了提高树节点的复用性,树节点本身不存储标识上下文类型的字段。

如果需要判断时,根据 parentNode 的 concept 去判断。如:

node.parentNode.concept === 'View'
deprecated

去除以前类似serviceType('view' | 'microService' | 'process')moduleType等字段

树节点本身尽量不存储是否可编辑字段

树节点本身是否可编辑其实是由上下文决定的。

比如某个逻辑不可编辑,是由于它是扩展模块下的子节点。

开发时可以用一个getter来实现。如:

get readonly() {
return this.module.type === 'extension';
}
deprecated

优先不用editableremovable等字段。

xxxNamespacexxxName确定引用意图

xxxNamespacexxxName两个字段确定引用意图,如:

{
"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

代替以前的$refschemaRefcalleeCodejoinPartRef等字段

开发时可以用一个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(逻辑节点)
ViewComponentViewElement(页面节点)new
ProcessComponentProcessElement(流程节点/边)new
Attribute(属性定义)BindAttribute(绑定属性)传参
Event(事件定义)BindEvent(绑定事件)传参