袋鼠云代码检查服务,揭秘高质量代码背后的秘密

这篇具有很好参考价值的文章主要介绍了袋鼠云代码检查服务,揭秘高质量代码背后的秘密。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

质量是产品的生命线,代码检查是软件开发过程中至关重要的一环,它可以帮助我们发现并纠正潜在的错误,提高软件质量,降低维护成本。

在袋鼠云产品中也存在这个问题,由于离线数据开发人员 SQL 水平不一,导致代码书写混乱、SQL 代码运行问题较多。本文将介绍在离线产品中如何利用 SQL 检查规则规范化 SQL 代码,对代码书写问题进行拦截,便于统一管理,用于预防引入需要治理的问题。

通过本文的介绍,我们希望您能够认识到代码检查的重要性,并了解如何通过最佳实践来提高代码质量和开发效率。

何时进行代码规则检查?

SQL 任务在离线产品界面开发完成之后,点击运行的按钮,会先经过代码规则检查,如果代码规则不满足则会提示到用户具体的原因。

袋鼠云代码检查服务,揭秘高质量代码背后的秘密

数据资产模块内置了 5 种代码检查规则,用户可以根据需要选择性开启。

袋鼠云代码检查服务,揭秘高质量代码背后的秘密

开启后在离线项目管理中可以选择使用的代码规则检查项、生效范围和 SQL 任务类型。

袋鼠云代码检查服务,揭秘高质量代码背后的秘密

在离线 SQL 任务中去运行一条 SQL 前会根据选择的规则先进行代码检查,如果代码检查不通过则会反馈给用户,用户可以根据实际需要判断要不要执行该 SQL。

袋鼠云代码检查服务,揭秘高质量代码背后的秘密

在数据资产的代码检查时间中可以看到已经触发的检查历史以及相应的统计数据。

袋鼠云代码检查服务,揭秘高质量代码背后的秘密

如何实现代码检查规则?

在 CodeCheck 包下定义了通用的代码规则检查的接口。

public interface ICheck {
 Result codeCheck(String checkContent, String defaultDb, Integer dataSourceType, Long tenantId, SqlParseInfo sqlParseInfo);
 CodeCheckType getCheckType();
}

以分区表查询必须带分区规则为例,会先调用 SQLParser 组件进行 SQL 解析,SQLParseInfo 即为 SQL 解析结果,检查时会先判断 SQL 语句是不是查询语句,如果是则判断查询的表是不是分区表,再判断是否有查询条件,最后判断查询条件中是否包含分区字段来判断是否检查通过。

public class CodeCheckImplType01 extends AbstractCheck {
 private static final Logger LOGGER = LoggerFactory.getLogger(CodeCheckImplType01.class);
 @Autowired
 private DataTableColumnThirdService dataTableColumnThirdService;
 @Autowired
 private DataTableThirdService dataTableThirdService;
 @Override
 public Result codeCheck(String checkContent, String defaultDb, Integer dataSourceType, Long tenantId, SqlParseInfo sqlParseInfo) {
 if (!isQuery(sqlParseInfo.getSqlType())) {
 return Result.buildSuccessResult();
 }
 try {
 MetadataSearchParam searchParam = new MetadataSearchParam();
 searchParam.setDbName(sqlParseInfo.getMainTable().getDb());
 searchParam.setTableName(sqlParseInfo.getMainTable().getName());
 searchParam.setDataSourceType(dataSourceType);
 searchParam.setTenantId(tenantId);
 List<TableDTO> tableDTOS = dataTableThirdService.tableList(searchParam);
 // 获取表信息
 for (TableDTO tableDTO : tableDTOS) {
 List<DataTableColumn> tableColumns = dataTableColumnThirdService.listColumnByTableIds(Lists.newArrayList(tableDTO.getTableId()));
 if (CollectionUtils.isEmpty(tableColumns)) {
 continue;
 }
 List<String> partitionColumnNameList = tableColumns.stream()
 .filter(Objects::nonNull)
 .filter(t -> HavePartitionEnum.have_partition.getPartitionValue().equals(t.getIsPartition()))
 .map(DataTableColumn::getColumnName)
 .collect(Collectors.toList());
 // 非分区表直接返回
 if (CollectionUtils.isEmpty(partitionColumnNameList)) {
 continue;
 }
 if (CollectionUtils.isEmpty(sqlParseInfo.getColumnIdentifierList())) {
 // 没有查询条件则校验失败
 return Result.buildFailedResult(String.format(getCheckType().getCheckResultFormat(), searchParam.getTableName()));
 }
 List<String> columnList = sqlParseInfo.getColumnIdentifierList().stream()
 .filter(c -> StringUtils.equals(c.getDb(), searchParam.getSchemaName()) && StringUtils.equals(c.getTable(), searchParam.getTableName()))
 .map(ColumnIdentifier::getColumn).collect(Collectors.toList());
 boolean disjoint = Collections.disjoint(partitionColumnNameList, columnList);
 if (disjoint) {
 return Result.buildFailedResult(String.format(getCheckType().getCheckResultFormat(), searchParam.getTableName()));
 }
 }
 } catch (Exception e) {
 // 异常情况先通过
 LOGGER.error("code check error, check content: {}, defaultDb: {}, checkType: {}", checkContent, defaultDb, getCheckType().name());
 }
 return Result.buildSuccessResult();
 }
 @Override
 public CodeCheckType getCheckType() {
 return CodeCheckType.TYPE_01;
 }
}

如何自定义代码检查规则?

如果内置的代码检查规则不满足客户的使用场景,客户可以通过上传 jar 的方式自定义代码检查规则。

袋鼠云代码检查服务,揭秘高质量代码背后的秘密

自定义代码检查规则使用 SPI 机制加载用户上传的自定义 jar,并在代码检测时调用 CodeCheck 方法,在资源关闭时调用 close 方法,用户需要将配置文件说明中的 jar 依赖自己的项目中。具体如下:

● 创建一个类实现接口

创建一个类实现接口 com.dtstack.assets.spi.codecheck.ICodeCheckClient 并实现 CodeCheck 和 close 方法,书写相关逻辑代码,如果校验通过需要将 CheckResult 对象中 success 设置为 true,失败时设置 success 字段为 false 并设置校验不通过的理由。

package com.dtstack.assets.spi.codecheck;
import java.util.Map;
public interface ICodeCheckClient {
 /**
 * 代码检查
 *
 * @param checkContent 检查内容
 * @param extMap 扩展配置
 * @return 检查结果
 */
 CheckResult codeCheck(String checkContent, Map<String, Object> extMap);
 /**
 * 释放资源, 调用时需要关闭所使用的资源
 */
 void close();
}

· 入参字段解释

– checkContent 为单条 SQL 信息

– extMap 会设置一些平台的属性,包含任务名称、任务类型等

· 出参字段解释

– success 为是否校验通过,必须设置

– checkResult 为校验结果,校验不通过时不能为空

package com.dtstack.demo;
import com.dtstack.assets.spi.codecheck.CheckResult;
import java.util.Map;
public class CodeCheckImpl implements com.dtstack.assets.spi.codecheck.ICodeCheckClient{
 @Override
 public CheckResult codeCheck(String checkContent, Map<String, Object> extMap) {
 // 代码检查相关逻辑
 CheckResult checkResult = new CheckResult();
 checkResult.setSuccess(false);
 checkResult.setCheckResult("校验不通过的理由");
 return checkResult;
 }
 @Override
 public void close() {
 // 关闭相关资源
 }
}

● 在 resource 目录下创建 META-INF/services 目录

袋鼠云代码检查服务,揭秘高质量代码背后的秘密

● 在 META-INF/services 目录下创建文件

文件名称为 com.dtstack.assets.spi.codecheck.ICodeCheckClient ,文件内容为实现 ICodeCheckClient 接口类的权限定类名。

袋鼠云代码检查服务,揭秘高质量代码背后的秘密

文件名称和内容示例:

袋鼠云代码检查服务,揭秘高质量代码背后的秘密

● 打包当前工程并在数据资产页面注册代码校验规则

不符合条件的 jar 会给出提示。

袋鼠云代码检查服务,揭秘高质量代码背后的秘密
袋鼠云代码检查服务,揭秘高质量代码背后的秘密

如何加载自定义代码规则对应的 jar ?

我们会为上传的每个规则对应的 jar 初始化一个唯一的自定义 classloader,该 classloader 继承 URLClassLoader 并保证子类加载器优先加载。

袋鼠云代码检查服务,揭秘高质量代码背后的秘密

在第一次调用时进行加载并缓存对应的 client。

袋鼠云代码检查服务,揭秘高质量代码背后的秘密

在用户重新上传或者编辑规则后清除旧的 classloader 和加载的 client 并释放资源。

袋鼠云代码检查服务,揭秘高质量代码背后的秘密

《数栈产品白皮书》:https://www.dtstack.com/resources/1004?src=szsm

《数据治理行业实践白皮书》下载地址:https://www.dtstack.com/resources/1001?src=szsm

想了解或咨询更多有关袋鼠云大数据产品、行业解决方案、客户案例的朋友,浏览袋鼠云官网:https://www.dtstack.com/?src=szbky

同时,欢迎对大数据开源项目有兴趣的同学加入「袋鼠云开源框架钉钉技术qun」,交流最新开源技术信息,qun号码:30537511,项目地址:https://github.com/DTStack文章来源地址https://www.toymoban.com/news/detail-710200.html

到了这里,关于袋鼠云代码检查服务,揭秘高质量代码背后的秘密的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 代码优美,搬砖不累:探索高质量代码之路

    写出高质量代码是每个程序员的追求,也是提高自己编程能力的必经之路。高质量的代码可以提高软件的可维护性、可读性、可扩展性和可移植性等,降低软件开发和维护的成本。本文将介绍一些如何写出高质量代码的实用技巧和方法。 可读性与可维护性 可读性指代码应该

    2024年02月02日
    浏览(65)
  • 程序员如何高质量重构代码?

    有道无术,术尚可求也,有术无道止于术。你好,我是程序员雪球,今天和你聊聊程序员重构代码那些事。   程序员重构代码的重要性不言而喻,但如何进行有效的重构呢?下面是一些建议和指导。 为什么要重构? 重构是提高代码质量和可维护性的重要手段,旨在在不改变

    2024年02月15日
    浏览(70)
  • Go语言——【高质量编程 | 代码规范】

    作者 :非妃是公主 专栏 :《Golang》 博客主页 :https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 高质量编程,就是指编写的代码能够达到正确可靠的同时,具备简洁清晰、结构明了等特点,可以让团队成员很快的上手。具体来说,有

    2024年02月01日
    浏览(100)
  • 阿里云X森马 AIGC T恤设计大赛;SD新手入门完全指南;揭秘LLM训练中的数学;LLM高质量阅读清单 | ShowMeAI日报

    👀 日报周刊合集 | 🎡 生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 比赛官网:https://developer.aliyun.com/adc/series/activity/aigc_design 阿里云携手服装品牌森马,推出了本次 AIGC T 恤设计大赛。开发者、设计师、AI绘画爱好者,都可以使用阿里云函数计算快速部署 Stable D

    2024年02月11日
    浏览(57)
  • 高质量病毒——暴风一号(BoyFine)代码.vbs

    最近我看到了一些很有趣的代码(主要是因为他是病毒),来,话不多说 直接上代码,希望对大家有帮助,此外,我要对它的名称进行说明,他的 中文名是暴风一号,英文名是BoyFine

    2024年02月11日
    浏览(51)
  • 以数字孪生技术服务社会,推动企业高质量发展

           随着“十四五”规划和2035年远景目标纲要中提出,要加快数字化发展,建设数字中国。为建设数字孪生智慧城市提供了国家战略指引。         新兴技术是数字孪生发展的助推剂,臻图信息通过数字孪生技术及研发的实景三维渲染引擎,搭载自主研发的ZTMap3D技

    2024年02月15日
    浏览(54)
  • 你是否曾经为自己写的代码而感到懊恼?那如何才能写出高质量代码呢?

    写出高质量代码是每个程序员的追求,因为高质量的代码可以提高程序的可维护性、可扩展性和可读性,从而减少代码的bug和维护成本。 当你的代码写的不好的时候会产生各种各样的问题,可能会导致以下问题: 1.代码可读性差: 代码结构混乱、命名不规范、注释不清晰等

    2024年02月02日
    浏览(52)
  • 2022数学建模国赛B题和C题高质量论文代码数据

    目录 B题论文 5.1 问题一的建模与求解 5.1.1 使用极坐标求解具体位置 C题论文 1.1 研究背景 1.2 问题的提 5.1 问题一的建模与求解 5.1.1 数据的预处理 5.1.1 使用极坐标求解具体位置 假设圆周的半径为, .以无人机FY00为极点, 以FY00为端点且经过FY01的射线为极轴建立极坐标系.不失一般

    2024年02月17日
    浏览(40)
  • 寿险公司通过开源治理保障数字创新,安全打通高质量服务新通道

    某寿险公司致力于为消费者提供人性化的产品和服务,在中国保险市场中始终保持前列。该寿险公司以挖掘和满足客户需求为出发点,从产品开发、渠道销售、运营流程和售后服务等各环节,借助数字化工具,不断地努力探索并提升服务品质。 该寿险公司借助数字科技力量,

    2024年02月03日
    浏览(58)
  • 《Effective Python 编写高质量Python代码的59个有效方法》学习笔记2

    尽量用enumerate取代range 用zip()同时遍历两个迭代器 合理使用try-except-else-finally 如果既要异常向上传播,又要在异常发生时执行清理工作,可使用try/finally结构 try/except/else结构可以清晰描述哪些异常由自己的代码处理,哪些传播到上一级 无论try块是否异常,都可用try/finally复合

    2023年04月25日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包