DataObjectImpl

news2024/9/21 3:15:10

DataObjectImpl

  • 目录
    • 概述
      • 需求:
    • 设计思路
    • 实现思路分析
      • 1.DataObjectImpl
      • 2.DeadLetterJobQueryImpl
      • 3.DeploymentQueryImpl
      • 4.Direction
      • 5.DynamicBpmnServiceImpl
  • 参考资料和推荐阅读

Survive by day and develop by night.
talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive.
happy for hardess to solve denpendies.

目录

在这里插入图片描述

概述

DataObjectImpl的是一个非常常见的需求。

需求:

设计思路

实现思路分析

1.DataObjectImpl

 private String name;
  private Object value;
  private String description;
  private String localizedName;
  private String localizedDescription;
  private String dataObjectDefinitionKey;

  private String type;

  public DataObjectImpl(String name, Object value, String description, String type, String localizedName,
      String localizedDescription, String dataObjectDefinitionKey) {

    this.name = name;
    this.value = value;
    this.type = type;
    this.description = description;
    this.localizedName = localizedName;
    this.localizedDescription = localizedDescription;
    this.dataObjectDefinitionKey = dataObjectDefinitionKey;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }

  public String getLocalizedName() {
    if (localizedName != null && localizedName.length() > 0) {
      return localizedName;
    } else {
      return name;
    }
  }

  public void setLocalizedName(String localizedName) {
    this.localizedName = localizedName;
  }

  public String getDescription() {
    if (localizedDescription != null && localizedDescription.length() > 0) {
      return localizedDescription;
    } else {
      return description;
    }
  }

  public void setDescription(String description) {
    this.description = description;
  }

  public Object getValue() {
    return value;
  }

  public void setValue(Object value) {
    this.value = value;
  }

  public String getType() {
    return type;
  }

  public void setType(String type) {
    this.type = type;
  }


  public String getDataObjectDefinitionKey() {
    return dataObjectDefinitionKey;
  }


  public void setDataObjectDefinitionKey(String dataObjectDefinitionKey) {
    this.dataObjectDefinitionKey = dataObjectDefinitionKey;
  }
}

2.DeadLetterJobQueryImpl

public class DeadLetterJobQueryImpl extends AbstractQuery<DeadLetterJobQuery, Job> implements DeadLetterJobQuery, Serializable {

  private static final long serialVersionUID = 1L;
  protected String id;
  protected String processInstanceId;
  protected String executionId;
  protected String processDefinitionId;
  protected boolean executable;
  protected boolean onlyTimers;
  protected boolean onlyMessages;
  protected Date duedateHigherThan;
  protected Date duedateLowerThan;
  protected Date duedateHigherThanOrEqual;
  protected Date duedateLowerThanOrEqual;
  protected boolean withException;
  protected String exceptionMessage;
  protected String tenantId;
  protected String tenantIdLike;
  protected boolean withoutTenantId;

  public DeadLetterJobQueryImpl() {
  }

  public DeadLetterJobQueryImpl(CommandContext commandContext) {
    super(commandContext);
  }

  public DeadLetterJobQueryImpl(CommandExecutor commandExecutor) {
    super(commandExecutor);
  }

  public DeadLetterJobQueryImpl jobId(String jobId) {
    if (jobId == null) {
      throw new ActivitiIllegalArgumentException("Provided job id is null");
    }
    this.id = jobId;
    return this;
  }

  public DeadLetterJobQueryImpl processInstanceId(String processInstanceId) {
    if (processInstanceId == null) {
      throw new ActivitiIllegalArgumentException("Provided process instance id is null");
    }
    this.processInstanceId = processInstanceId;
    return this;
  }

  public DeadLetterJobQueryImpl processDefinitionId(String processDefinitionId) {
    if (processDefinitionId == null) {
      throw new ActivitiIllegalArgumentException("Provided process definition id is null");
    }
    this.processDefinitionId = processDefinitionId;
    return this;
  }

  public DeadLetterJobQueryImpl executionId(String executionId) {
    if (executionId == null) {
      throw new ActivitiIllegalArgumentException("Provided execution id is null");
    }
    this.executionId = executionId;
    return this;
  }

  public DeadLetterJobQueryImpl executable() {
    executable = true;
    return this;
  }

  public DeadLetterJobQueryImpl timers() {
    if (onlyMessages) {
      throw new ActivitiIllegalArgumentException("Cannot combine onlyTimers() with onlyMessages() in the same query");
    }
    this.onlyTimers = true;
    return this;
  }

  public DeadLetterJobQueryImpl messages() {
    if (onlyTimers) {
      throw new ActivitiIllegalArgumentException("Cannot combine onlyTimers() with onlyMessages() in the same query");
    }
    this.onlyMessages = true;
    return this;
  }

  public DeadLetterJobQueryImpl duedateHigherThan(Date date) {
    if (date == null) {
      throw new ActivitiIllegalArgumentException("Provided date is null");
    }
    this.duedateHigherThan = date;
    return this;
  }

  public DeadLetterJobQueryImpl duedateLowerThan(Date date) {
    if (date == null) {
      throw new ActivitiIllegalArgumentException("Provided date is null");
    }
    this.duedateLowerThan = date;
    return this;
  }

  public DeadLetterJobQueryImpl duedateHigherThen(Date date) {
    return duedateHigherThan(date);
  }

  public DeadLetterJobQueryImpl duedateHigherThenOrEquals(Date date) {
    if (date == null) {
      throw new ActivitiIllegalArgumentException("Provided date is null");
    }
    this.duedateHigherThanOrEqual = date;
    return this;
  }

  public DeadLetterJobQueryImpl duedateLowerThen(Date date) {
    return duedateLowerThan(date);
  }

  public DeadLetterJobQueryImpl duedateLowerThenOrEquals(Date date) {
    if (date == null) {
      throw new ActivitiIllegalArgumentException("Provided date is null");
    }
    this.duedateLowerThanOrEqual = date;
    return this;
  }

  public DeadLetterJobQueryImpl withException() {
    this.withException = true;
    return this;
  }

  public DeadLetterJobQueryImpl exceptionMessage(String exceptionMessage) {
    if (exceptionMessage == null) {
      throw new ActivitiIllegalArgumentException("Provided exception message is null");
    }
    this.exceptionMessage = exceptionMessage;
    return this;
  }

  public DeadLetterJobQueryImpl jobTenantId(String tenantId) {
    if (tenantId == null) {
      throw new ActivitiIllegalArgumentException("job is null");
    }
    this.tenantId = tenantId;
    return this;
  }

  public DeadLetterJobQueryImpl jobTenantIdLike(String tenantIdLike) {
    if (tenantIdLike == null) {
      throw new ActivitiIllegalArgumentException("job is null");
    }
    this.tenantIdLike = tenantIdLike;
    return this;
  }

3.DeploymentQueryImpl

public class DeploymentQueryImpl extends AbstractQuery<DeploymentQuery, Deployment> implements DeploymentQuery, Serializable {

  private static final long serialVersionUID = 1L;
  protected String deploymentId;
  protected String name;
  protected String nameLike;
  protected String category;
  protected String categoryLike;
  protected String categoryNotEquals;
  protected String key;
  protected String keyLike;
  protected String tenantId;
  protected String tenantIdLike;
  protected boolean withoutTenantId;
  protected String processDefinitionKey;
  protected String processDefinitionKeyLike;
  protected boolean latest;
  protected boolean latestVersion;

  public DeploymentQueryImpl() {
  }

  public DeploymentQueryImpl(CommandContext commandContext) {
    super(commandContext);
  }

  public DeploymentQueryImpl(CommandExecutor commandExecutor) {
    super(commandExecutor);
  }

  public DeploymentQueryImpl deploymentId(String deploymentId) {
    if (deploymentId == null) {
      throw new ActivitiIllegalArgumentException("Deployment id is null");
    }
    this.deploymentId = deploymentId;
    return this;
  }

  public DeploymentQueryImpl deploymentName(String deploymentName) {
    if (deploymentName == null) {
      throw new ActivitiIllegalArgumentException("deploymentName is null");
    }
    this.name = deploymentName;
    return this;
  }

  public DeploymentQueryImpl deploymentNameLike(String nameLike) {
    if (nameLike == null) {
      throw new ActivitiIllegalArgumentException("deploymentNameLike is null");
    }
    this.nameLike = nameLike;
    return this;
  }

  public DeploymentQueryImpl deploymentCategory(String deploymentCategory) {
    if (deploymentCategory == null) {
      throw new ActivitiIllegalArgumentException("deploymentCategory is null");
    }
    this.category = deploymentCategory;
    return this;
  }

  public DeploymentQueryImpl deploymentCategoryLike(String categoryLike) {
    if (categoryLike == null) {
      throw new ActivitiIllegalArgumentException("deploymentCategoryLike is null");
    }
    this.categoryLike = categoryLike;
    return this;
  }

  public DeploymentQueryImpl deploymentCategoryNotEquals(String deploymentCategoryNotEquals) {
    if (deploymentCategoryNotEquals == null) {
      throw new ActivitiIllegalArgumentException("deploymentCategoryExclude is null");
    }
    this.categoryNotEquals = deploymentCategoryNotEquals;
    return this;
  }

  public DeploymentQueryImpl deploymentKey(String deploymentKey) {
    if (deploymentKey == null) {
      throw new ActivitiIllegalArgumentException("deploymentKey is null");
    }
    this.key = deploymentKey;
    return this;
  }

  public DeploymentQueryImpl deploymentKeyLike(String deploymentKeyLike) {
    if (deploymentKeyLike == null) {
      throw new ActivitiIllegalArgumentException("deploymentKeyLike is null");
    }
    this.keyLike = deploymentKeyLike;
    return this;
  }

  public DeploymentQueryImpl deploymentTenantId(String tenantId) {
    if (tenantId == null) {
      throw new ActivitiIllegalArgumentException("deploymentTenantId is null");
    }
    this.tenantId = tenantId;
    return this;
  }

  public DeploymentQueryImpl deploymentTenantIdLike(String tenantIdLike) {
    if (tenantIdLike == null) {
      throw new ActivitiIllegalArgumentException("deploymentTenantIdLike is null");
    }
    this.tenantIdLike = tenantIdLike;
    return this;
  }

  public DeploymentQueryImpl deploymentWithoutTenantId() {
    this.withoutTenantId = true;
    return this;
  }

  public DeploymentQueryImpl processDefinitionKey(String key) {
    if (key == null) {
      throw new ActivitiIllegalArgumentException("key is null");
    }
    this.processDefinitionKey = key;
    return this;
  }

  public DeploymentQueryImpl processDefinitionKeyLike(String keyLike) {
    if (keyLike == null) {
      throw new ActivitiIllegalArgumentException("keyLike is null");
    }
    this.processDefinitionKeyLike = keyLike;
    return this;
  }

  public DeploymentQueryImpl latest() {
    if (key == null) {
      throw new ActivitiIllegalArgumentException("latest can only be used together with a deployment key");
    }

    this.latest = true;
    return this;
  }

  @Override
  public DeploymentQuery latestVersion() {
    this.latestVersion = true;

    return this;
  }

在这里插入图片描述

4.Direction

public class Direction {

  private static final Map<String, Direction> directions = new HashMap<String, Direction>();

  public static final Direction ASCENDING = new Direction("asc");
  public static final Direction DESCENDING = new Direction("desc");

  private String name;

  public Direction(String name) {
    this.name = name;
    directions.put(name, this);
  }

  public String getName() {
    return name;
  }

  public static Direction findByName(String directionName) {
    return directions.get(directionName);
  }
}

在这里插入图片描述

5.DynamicBpmnServiceImpl

public class DynamicBpmnServiceImpl extends ServiceImpl implements DynamicBpmnService, DynamicBpmnConstants {

  public DynamicBpmnServiceImpl(ProcessEngineConfigurationImpl processEngineConfiguration) {
    super(processEngineConfiguration);
  }

  public ObjectNode getProcessDefinitionInfo(String processDefinitionId) {
    return commandExecutor.execute(new GetProcessDefinitionInfoCmd(processDefinitionId));
  }

  public void saveProcessDefinitionInfo(String processDefinitionId, ObjectNode infoNode) {
    commandExecutor.execute(new SaveProcessDefinitionInfoCmd(processDefinitionId, infoNode));
  }

  public ObjectNode changeServiceTaskClassName(String id, String className) {
    ObjectNode infoNode = processEngineConfiguration.getObjectMapper().createObjectNode();
    changeServiceTaskClassName(id, className, infoNode);
    return infoNode;
  }

  public void changeServiceTaskClassName(String id, String className, ObjectNode infoNode) {
    setElementProperty(id, SERVICE_TASK_CLASS_NAME, className, infoNode);
  }

  public ObjectNode changeServiceTaskExpression(String id, String expression) {
    ObjectNode infoNode = processEngineConfiguration.getObjectMapper().createObjectNode();
    changeServiceTaskExpression(id, expression, infoNode);
    return infoNode;
  }

  public void changeServiceTaskExpression(String id, String expression, ObjectNode infoNode) {
    setElementProperty(id, SERVICE_TASK_EXPRESSION, expression, infoNode);
  }

  public ObjectNode changeServiceTaskDelegateExpression(String id, String expression) {
    ObjectNode infoNode = processEngineConfiguration.getObjectMapper().createObjectNode();
    changeServiceTaskDelegateExpression(id, expression, infoNode);
    return infoNode;
  }

  public void changeServiceTaskDelegateExpression(String id, String expression, ObjectNode infoNode) {
    setElementProperty(id, SERVICE_TASK_DELEGATE_EXPRESSION, expression, infoNode);
  }

  public ObjectNode changeScriptTaskScript(String id, String script) {
    ObjectNode infoNode = processEngineConfiguration.getObjectMapper().createObjectNode();
    changeScriptTaskScript(id, script, infoNode);
    return infoNode;
  }

  public void changeScriptTaskScript(String id, String script, ObjectNode infoNode) {
    setElementProperty(id, SCRIPT_TASK_SCRIPT, script, infoNode);
  }

  public ObjectNode changeUserTaskName(String id, String name) {
    ObjectNode infoNode = processEngineConfiguration.getObjectMapper().createObjectNode();
    changeUserTaskName(id, name, infoNode);
    return infoNode;
  }

  public void changeUserTaskName(String id, String name, ObjectNode infoNode) {
    setElementProperty(id, USER_TASK_NAME, name, infoNode);
  }

  public ObjectNode changeUserTaskDescription(String id, String description) {
    ObjectNode infoNode = processEngineConfiguration.getObjectMapper().createObjectNode();
    changeUserTaskDescription(id, description, infoNode);
    return infoNode;
  }

  public void changeUserTaskDescription(String id, String description, ObjectNode infoNode) {
    setElementProperty(id, USER_TASK_DESCRIPTION, description, infoNode);
  }

  public ObjectNode changeUserTaskDueDate(String id, String dueDate) {
    ObjectNode infoNode = processEngineConfiguration.getObjectMapper().createObjectNode();
    changeUserTaskDueDate(id, dueDate, infoNode);
    return infoNode;
  }

  public void changeUserTaskDueDate(String id, String dueDate, ObjectNode infoNode) {
    setElementProperty(id, USER_TASK_DUEDATE, dueDate, infoNode);
  }

  public ObjectNode changeUserTaskPriority(String id, String priority) {
    ObjectNode infoNode = processEngineConfiguration.getObjectMapper().createObjectNode();
    changeUserTaskPriority(id, priority, infoNode);
    return infoNode;
  }

  public void changeUserTaskPriority(String id, String priority, ObjectNode infoNode) {
    setElementProperty(id, USER_TASK_PRIORITY, priority, infoNode);
  }

  public ObjectNode changeUserTaskCategory(String id, String category) {
    ObjectNode infoNode = processEngineConfiguration.getObjectMapper().createObjectNode();
    changeUserTaskCategory(id, category, infoNode);
    return infoNode;
  }

  public void changeUserTaskCategory(String id, String category, ObjectNode infoNode) {
    setElementProperty(id, USER_TASK_CATEGORY, category, infoNode);
  }

  public ObjectNode changeUserTaskFormKey(String id, String formKey) {

在这里插入图片描述

在这里插入图片描述

参考资料和推荐阅读

[1].www.activity.org

欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/21943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDEA2022版本创建maven web项目(两种方式)

目录 一、使用骨架的方式 二、maven中添加 web方式 总结&#xff1a; 前言&#xff1a; 创建maven web项目有两种方式&#xff0c;一种是使用骨架方式&#xff0c;一种是不使用骨架的方式 一、使用骨架的方式 1.打开idea&#xff0c;按照步骤创建一个新的项目 2.点击Mave…

【高级篇】Java JVM实战 之 内存调优

文章目录一、通过Jprofiler调式Dump文件错误⛅ 什么是Jprofiler&#xff1f;⚡使用Jprofiler调试Dump文件二、堆内存调优三、 GC垃圾回收器四、GC常用算法❄️引用计数法⛄复制算法♨️标记清除算法⛽标记压缩⚠️标记清除压缩五、JMM⛵小结一、通过Jprofiler调式Dump文件错误 …

Spark 3.0 - 4.Pipeline 管道的工作流程

目录 一.引言 二.基本组件 三.Pipeline 基本流程 1.训练 Pipeline - Estimator 2.预测 Pipeline - Transformer 四.Pipeline 分解与构造 1.DataFrame 2.Transformer1 - Tokenizer 3.Transformer2 - HashingTF 4.Estimator - LR 5.Pipeline With ParamMap - Estimat…

SpringCloud微服务(一)——Consul服务注册中心

Consul服务注册中心 SpringCloud 中文官网&#xff1a;https://www.springcloud.cc/spring-cloud-consul.html Consul是一套开源的分布式服务发现和配置管理系统&#xff0c;Go语言开发。 Consul是一个服务网格&#xff08;微服务间的 TCP/IP&#xff0c;负责服务之间的网络…

SharedPreferences存储

文章目录 前言 听说SharedPreferences存储技术快过时了&#xff0c;不过如果是单纯的使用的话&#xff0c;不费什么时间成本。 本文的Demo摘录自《第一行代码》。 一.什么是SharedPreferences SharedPreferences&#xff0c;一种通过使用键值对的方式来存储数据的技术。 二…

【深入浅出Spring6】第八期——面向切面编程 AOP

AOP&#xff08;Aspect Oriented Programming&#xff09;面向切面编程&#xff0c;属于面向对象编程的一种衍射&#xff0c;是一种编程思想或技术AOP的底层是由动态代理机制实现的 JDK动态代理CGLIB动态代理&#xff0c;自动识别并切换我们也可以通过配置属性指定就是用CGLIB …

【MySQL】六,sql_model的合理设置

宽松模式和严格模式 宽松模式 如果设置的是宽松模式&#xff0c;那么我们在插入数据的时候&#xff0c;即使是给了一个错误的数据&#xff0c;那么可能也不会报错。 举例&#xff1a;某张表的name字段为 char(10) &#xff0c;插入数据的时候&#xff0c;如果name字段的数据长…

免费搜题系统

免费搜题系统 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击跳转&a…

跨模态神经搜索实践VCED 基于Streamlit实现前端页面设计和逻辑

1. Streamlit入门 1.1 Streamlit介绍 Streamlit是基于Python的Web应用程序框架&#xff0c;它可以使用Python代码轻松构建机器学习/数据科学相关的仪表板&#xff0c;其特点包括&#xff1a; 跨平台&#xff1a;支持Windows、macOS、Linux只需要掌握Python&#xff1a;不需要…

【时序】时间序列数据预处理

目录 1. 时间戳转换 2. 缺失值处理 3. 去噪 1&#xff09;滚动平均值 2&#xff09;傅里叶变换 4. 异常点检测 1&#xff09;基于滚动统计的方法 2&#xff09;孤立森林 3&#xff09;K-means 聚类 为了分析预处理结果&#xff0c;我们后续使用 Kaggle 的 Air Passenge…

【Python】发布一个简单好用的日志记录器bestlog

需求 日志是非常重要的一个东西&#xff0c;我们往往习惯于在开发一个新项目的第一行代码时&#xff0c;就用 logging.info 代替 print&#xff0c;随时保持记录的好习惯&#xff0c;等代码上线以后也无需修改替换那些 print&#xff0c;直接开跑&#xff0c;有了完善的日志&a…

牛客刷题——Python入门总结

&#x1f935;‍♂️ 个人主页: 北极的三哈 个人主页 &#x1f468;‍&#x1f4bb; 作者简介&#xff1a;Python领域优质创作者。 &#x1f4d2; 系列专栏&#xff1a;《Python入门学习》《牛客题库-Python篇》 &#x1f310;推荐《牛客网》——找工作神器|笔试题库|面试经…

【软考软件评测师】第三十章 操作系统(PV操作与死锁)

【软考软件评测师】第三十章 操作系统&#xff08;PV操作与死锁&#xff09; 第三十章 操作系统&#xff08;PV操作与死锁&#xff09;【软考软件评测师】第三十章 操作系统&#xff08;PV操作与死锁&#xff09;第一部分 知识点集锦1.PV操作1&#xff09;P操作的定义2&#xf…

win11的文件属性默认显示全部,Windows11右键菜单修改为Win10模式的方法(手把手详细操作)

win11的文件属性默认显示全部&#xff0c;Windows11右键菜单修改为Win10模式的方法&#xff08;手把手详细操作&#xff09; 文章目录win11的文件属性默认显示全部&#xff0c;Windows11右键菜单修改为Win10模式的方法&#xff08;手把手详细操作&#xff09;Tips 1 先以管理员…

Source Map知多少?Golang手写SourceMap转换过程

文章目录一、问题背景二、Source Map 简介基本格式应用场景三、Source Map 的工作原理四、Source Map 的转换过程代码示例总结本文从原理的角度入手对 Source Map 进行了较为深入的分析&#xff0c;并从业务需要的角度出发&#xff0c;手动编写根据 Source Map 映射编码前后代码…

SpringBoot集成Mybatis项目实操

本文为《从零打造项目》系列第三篇文章&#xff0c;首发于个人网站。 《从零打造项目》系列文章 比MyBatis Generator更强大的代码生成器 SpringBoot项目基础设施搭建 前言 基于 orm-generate 项目可以实现项目模板代码&#xff0c;集成了三种 ORM 方式&#xff1a;Mybatis、M…

35m预应力简支梁桥毕业设计 课程设计-桥梁工程(计算书、8张CAD图)

35m预应力简支梁桥毕业设计 目 录 1、引言 1 2、桥型方案比选 2 2&#xff0e;1 桥梁设计原则 2 2.2方案一&#xff1a;25m预应力钢筋混凝土T梁桥 2 2.3方案二&#xff1a;25m预应力钢筋混凝土小箱梁 4 2.4桥墩方案比选 4 3、上部结构设计计算 5 3&#xff0e;1 设计资料及构造…

考研数据结构填空题整合

考研数据结构填空题整合 目录考研数据结构填空题整合一、ZYL组ZYL组一ZYL组二ZYL组三ZYL组四ZYL组五ZYL组六ZYL组七ZYL组八二、TJP组TJP组一TJP组二TJP组三三、LZH组LZH 组一LZH 组二LZH 组三LZH 组四LZH 组五LZH 组六LZH 组七四、LB组LB组一LB组二LB组三LB组四LB组五LB组六LB组…

FPGA实现精简版UDP通信,占资源很少但很稳定,提供2套工程源码

目录1.高端、中等和精简版UDP通信的选择2.精简版UDP通信实现方案3.工程1介绍及资源占用率和性能表现4.工程2介绍及资源占用率和性能表现5.上板调试验证6.福利&#xff1a;工程代码的获取1.高端、中等和精简版UDP通信的选择 FPGA实现UDP协议可难可易&#xff0c;具体根据项目需…

Python 函数转命令行界面库 -- Argsense CLI

argsense 是一个 python 命令行界面库, 是 click, fire, typer 之外的又一个选项. argsense 最大的特点是极低的侵入性设计和近乎零成本的上手难度, 如果你熟悉 python 函数是如何传参的 (这是大部分 python 初学者已经掌握的知识), 那么你就可以很快上手 argsense. 特性一览 …