原子操作封装
1. 原子操作分类
按使用范围分类,可以分为项目原子操作和通用原子操作。项目原子操作代码在项目中,由开发人员自行创建和使用,其通用性只限于一个项目之内甚至一个项目的部分页面。而通用型原子操作则在多个项目甚至全部项目都适用。
在响应,服务,项目级原子操作中,均可引用原子操作。
举例一个常用的例子说明:比如一个项目中使用的数据库只有一个到两个,就可以将数据库名称封装进一到两个项目级原子操作中,从而减少调用时数据库名称传参。这样的做的好处是在数据库固定的情况下,可以加速项目的开发速度,且维护相对也简单。
2. 创建方法
通过vscode命令mmstudio: Add new atom
创建。
2.1. 项目原子操作
可以在项目中实现某个通用操作,其代码实现制作为一个原子操作index.ts
(目前限定其为某一个函数),并将其插入代码模板写入use.snippet
。也可以将项目中常用的几个原子操作的使用编写为一个原子操作,在项目中快速引用。
2.1.1. 示例
上面提到过,在项目中可以添加一些项目级的原子操作,以方便开发使用。例如某项目只有两个数据库,一个为配置库,一个为业务库,我们可以将对这两个数据库的原子操作进行简单封装,以方便项目使用。具体做法为
- 在项目中添加项目级原子操作,快捷键为
alt+m a
- 参数个数设置为2个(如果没有参数,可以设置为0)
- 使用快捷键添加sql查询原子操作
alt+t a
-
插入数据库原子操作(编号14),并修改参数如下所示:
import an14 from '@mmstudio/an000014'; export default async function anp1<T>(sql: string, ...args: unknown[]) { // sql查询 /** * 数据库返回值 */ const [r1603335417] = await (() => { const p1 = 'db001'; return an14<T>(p1, [sql, args]); })(); return r1603335417; }
-
接下来,我们将代码模板修改好,如下所示
// 业务库sql查询 /** * ${0:查询数据表结果} */ const r$CURRENT_SECONDS_UNIX = await(() => { const p1 = '$1'; // sql,示例见下: // postgres: insert into tb001 (name) values (\$1),(\$2),(\$3); // mysql: insert into tb001 (name) values (?),(?),(?); interface ITable { id: string; } return anp1<ITable>(p1); // const p21 = 'mmstudio001'; // sql中占位符对应的参数值 // const p22 = 'mmstudio002'; // sql中占位符对应的参数值 // const p23 = 'mmstudio003'; // sql中占位符对应的参数值 // return anp1<ITable>(p1, p21, p22, p23); })();
- 这样一个项目级的原子操作就完成了,使用它进行单表的查询将会变得非常简单。我们如果要在某个服务中使用它,只需要打开服务文件,使用快捷键
alt+t a
在本地
选择anp001
就可以快速添加了
2.2. 代码模板snippet的写法
其实上面的示例已经展示了代码模板的写法,下面为一些说明。
- 普通的文本按原样插入到使用位置
$
为一个特殊字符,如果要在代码模板中输入一个字符$
,必须加上转义符\
,即\$
方可。- 如果
$
它后跟一个数字,如$1
,$2
,则表示一个停止符,在插入原子操作时通过tab键可以按$
后的数字切换光标位置。 $
后如果后跟大括号,如${1}
,${2}
,其作用同$1
,$2
。$
后大括号中数字后如跟:
,如${1:val}
,则:
后为默认插入内容,当光标停留时默认内容将被选中,且可修改$
后大括号中数字后如跟|
,需要保证大括号结束前也要有一个|
,如${1:|a,b,c|}
,则|
之间的内容当光标停留时将按,
分隔,作为枚举列表供选择,注意应当按实际使用场景调整顺序。$CURRENT_SECONDS_UNIX
为一个数字值,通常它是唯一的,可以用它作为变量名
3. 通用原子操作
3.1. 通用型原子操作
注意事项:
- 最好先确定好原子操作的名称,因为它将展示给所有开发人员,尽可能将其描述精确、简练。
- 希望加入团队的人员请联系我.我将非常乐意接受社区的贡献。
- 原子操作要有单元测试,否则有可能将无法通过审核合并。