0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Elasticsearch Mapping类型修改

京东云 来源:jf_75140285 作者:jf_75140285 2024-08-09 16:00 次阅读

原创声明:该文章是个人在项目中亲历后的经验总结和分享,如有搬运需求请注明出处。 这是“深入浅出系列”文章的第一篇,主要记录和分享程序设计的一些思想和方法论,如果读者觉得所有受用,还请“一键三连”,这是对我最大的鼓励。

一、老生常谈,到底啥是可读性

一句话:见名知其义。有人说好的代码必然有清晰完整的注释,我不否认;也有人说代码即注释,是代码简洁之道的最高境界,我也不否认。但我都不完全接受,如果照搬前者,有人会在每个方法、每个循环、每个判断都添加大量注释,对于一个表达不严谨的coder来说,代码与汉字可能词不达意;而且,一旦代码逻辑发生变化,注释改不改?对于后者,英语水平可能也就是个半吊子,动词名词不区分,真能做到代码即注释的有多少人?

二、骂归骂,总归要硬着头皮干

先来举个简单例子:

public StepExitEnum doExecute(StepContext stepContext) throws Exception {
    String targetFilePath = this.getOriginFilePath(stepContext.getJobContext());//获取目标路径
    File targetDir = new File(targetFilePath);
    if (!targetDir.exists()) {
        targetDir.mkdirs();//如果不存在目录则创建
    }

    String encryptedFilePath = this.getEncryptedFilePath(stepContext.getJobContext());//获取加密文件路径
    String fileName = this.getFileName(stepContext);//获取文件名
    File[] encryptedFiles = new File(encryptedFilePath).listFiles(this.buildFilenameFilter(fileName));//过滤文件

    FileEncryptor dencryptor = this.buildFileEncryptor(stepContext);//创建FileEncryptor
    Stream.of(encryptedFiles)
            .forEach(encryptFile -> {
                File targetFile = new File(targetFilePath, encryptFile.getName());
                dencryptor.invoke(encryptFile, targetFile);//解密文件
            });

    return StepExitEnum.CONTINUING;
}

这种代码很常见,耐着性子其实也容易看懂:创建目录->读取加密文件->解密文件,就当前来说其实满足了业务需求也就可以了,但不够优雅,从长期来讲,这会产生bad smell,首先,“如果不存在目录则创建”、“获取文件名”这类注释有何意义?有可能这是coder当时的方案思路,但这里真的需要吗?它确确实实影响我的注意力了,但我没有获取到任何有价值信息;其次,若想要理解doExecute这个方法的目的,必须通读代码,而我只是想知道它做了什么事;最后,这个方法如果某一行出问题了,那么影响范围是整个业务流程。

如果后期需要改动,大部分人可能会增加条件判断,或是在后面继续追加代码实现,最后会导致越来越难以阅读,这其实也就是“能运行就不要动它”这个梗的根源了,因为没人能读明白它到底做了什么,但又不得不改,同时可能伴随着“口吐芬芳”。

三、意识先行,从一行做起

那么到底该如何做呢?下面是我的一个例子:

public StepExitEnum doExecute(StepContext stepContext) throws Exception {
    initTempFilePath(stepContext);
    File[] encryptedFiles = findEncryptedFiles(stepContext);
    dencryptFiles(encryptedFiles, stepContext);
    return StepExitEnum.CONTINUING;
}

先不论具体实现细节,是不是一眼看过之后就了解doExecute做了什么事?这个方法的确没有任何注释,是否影响阅读?其实我做的只是把先前的代码重新归类,分别放到了三个方法中,核心实现还是原本的代码,没有改动,现在阅读起来是不是顺畅了许多?

通读代码后我发现其实只做了三件事:创建目录、读取加密文件、解密文件,这是最核心的三个步骤,把它抽象出来,独立为方法,既表达了逻辑功能,也清晰阅读,还可以缩小影响范围,今后哪里有问题改哪里,不需要再通读代码了。

四、回到主题,再说可读性

(1)抽象,合理的业务逻辑抽象

“一个方法只应该做一件事”,想必很多人听过类似的表述,听起来简单做起来难,怎么定义“只做一件事”?这件事的边界是什么?这就依赖coder对业务逻辑、对功能实现的深入理解和合理抽象,这才能清晰的区分出各个功能的边界,或者说是如何定义这件“事”。

没有基于业务的合理抽象,硬生生地写了几个方法,你会发现这几个方法“藕断丝连”,一个方法的参数变化总会影响到另一个方法,很难将一个方法单拎出来应用在其他场景,一处改,处处改,这时候就要考虑,方法抽象的是否合理?

合理的抽象,从功能角色、职责划分上就很清晰,有了这个基础,才能清晰的编写业务逻辑代码,而不是堆砌各种条件判断和循环,同时带着两条斜杠和注释,这是可读性的基础。

(2)各司其职,职责单一

一个方法只做一件事,扩展到一个类也如此,职责单一,归根结底还得基于合理的抽象,所以,它其实是抽象的一种具体体现,二者总是相辅相成。

(3)命名规范

这也是老生常谈了,但真正做到的coder其实不多,类名、方法、变量的命名规则其实很有讲究,但这不是本文的主题,不多赘述,类名用名词,方法名用动词,因为类表述的是做什么事,而方法名表述的是如何做,规范的命名和正确的词法,这是编码的基础功底,这会有助于他人阅读代码,当然也是为什么我们读spring源码会感觉顺畅,而读同事写的业务代码却很蹩脚的原因,我们太过于强调spring的IOC了,却忽略了最基础的东西。

(4)关键注释

注释不能少,但也不应该每个方法、每个判断、每个循环到处都是//和/*,毕竟代码是主体不是注释,而且这样还会带来隐性的工作量问题:代码修改,注释也必须修改。所以好的注释不是多,是关键。例如java.util.HashMap类的注释上会告诉你线程安全问题:

Note that this implementation is not synchronized.

这是很关键的信息,所以注释要给出关键性的、使用上注意的事项,不在于多。

代码可读性其实是一个比较宽泛的问题,也是一个老生常谈的问题,随着编码经验积累,在不同职业阶段,我们对可读性都会有不同的理解和认识,本文从我自己的角度和经验,讨论了一些比较浅的理解,如何写出易读、易懂的优秀代码,可能是我们coder永远追寻的目标之一,即使它没有终点。

最后别忘了“一键三连”!

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 代码
    +关注

    关注

    30

    文章

    4733

    浏览量

    68277
收藏 人收藏

    评论

    相关推荐

    Elasticsearch 再次开源

    Elasticsearch 和 Kibana 又可以被称为开源了。很难表达这句话让我有多高兴。我激动得简直要跳起来了。我们 Elastic 的所有人都是如此。开源是我的 DNA。这也是Elastic的DNA。能够再次将 Elasticsearch 称为开源,我感到非常高兴
    的头像 发表于 11-13 12:14 30次阅读
    <b class='flag-5'>Elasticsearch</b> 再次开源

    如何修改buildroot和debian文件系统

    本文档主要介绍在没有编译环境的情况下,如何修改buildroot和debian文件系统方法,如在buildroot文件系统中添加文件、修改目录等文件操作,在debian文件系统中,安装软件库、工具、扩大文件系统空间等等操作。
    的头像 发表于 07-22 17:46 406次阅读
    如何<b class='flag-5'>修改</b>buildroot和debian文件系统

    ESP32-S3是否支持修改控制端点数据类型

    ESP32-S3是否支持修改控制端点数据类型(如标准类型,自定义类型); 我需要在控制传输数据阶段的DATA0包改为我的USB设备规定的8个字节的数据
    发表于 06-07 06:00

    用DAVE配置XMC1302的两个引脚为AD引脚,为什么在PIN MAPPING PERSPECTIVE中引脚配置不能同时配置为AD引脚?

    请问用DAVE配置XMC1302的两个引脚为AD引脚,为什么在PIN MAPPING PERSPECTIVE中引脚配置不能同时配置为AD引脚??
    发表于 05-20 06:22

    DFU显示Unable to find or decode device mapping... Bad Firmware的原因?

    DFU 显示 Unable to find or decode device mapping... Bad Firmware什么问题
    发表于 04-03 06:32

    Rust编写的首个Postgres基础Elasticsearch开源替代品问世

    ,Firebase 开源替代 Supabase,AirTable 开源替代 NocoDB,等等等等,现在又多了 ElasticSearch 开源替代 —— ParadeDB。
    的头像 发表于 02-22 11:34 749次阅读
    Rust编写的首个Postgres基础<b class='flag-5'>Elasticsearch</b>开源替代品问世

    更改晶振后如何修改配置?

    GD32官方提供的固件库中使用的晶振配置一般为8M或25M,如果读者使用其他频率的晶振如何修改配置呢?本文为大家讲解如何修改
    的头像 发表于 01-09 10:10 1075次阅读
    更改晶振后如何<b class='flag-5'>修改</b>配置?

    orcad修改封装怎么更新库

    Orcad是一款专业的电路设计软件,可以用于创建和编辑电路图和PCB布局。当我们需要修改封装并更新库时,我们可以按照以下步骤进行操作: 打开Orcad软件并进入封装库管理界面。在菜单栏中找到并点击
    的头像 发表于 12-20 09:59 3872次阅读

    如何修改内核设备树

    如何修改内核设备树
    的头像 发表于 12-14 14:06 758次阅读
    如何<b class='flag-5'>修改</b>内核设备树

    python如何修改列表中的每一个值数据

    在Python中,我们可以使用不同的方法来修改列表中的每一个值数据。 方法一:使用for循环遍历列表并修改元素值 首先,我们可以使用for循环遍历列表中的每一个元素,并使用索引来修改对应位置的值
    的头像 发表于 11-29 17:03 4798次阅读

    VLAN Mapping技术的适用场景和实现方式

    VLAN Mapping的主要的功能是将用户报文中的私网VLAN Tag替换为公网的VLAN Tag,使其按照公网的网络规划进行传输。一般主要使用于运营商环境,企业网络环境还是很少有机会碰到的。
    的头像 发表于 11-27 10:34 2123次阅读
    VLAN <b class='flag-5'>Mapping</b>技术的适用场景和实现方式

    oracle修改表字段长度语句

    Oracle 修改表字段长度可以通过使用 ALTER TABLE 语句来实现。在对表进行修改之前,我们需要先了解一些基本的概念。 表字段长度是指在数据库表中用来存储数据的列的最大容量。当我们需要存储
    的头像 发表于 11-21 11:34 1904次阅读

    oracle修改数据库表字段类型

    修改Oracle数据库表中的字段类型,您可以按照以下步骤进行操作: 1.备份数据:在进行任何修改之前,建议先备份数据库以防止数据丢失。使用Oracle提供的备份工具或通过创建表的副本来实现数据备份
    的头像 发表于 11-21 11:33 3165次阅读

    修改查询将clob转成字符类型

    在进行Oracle数据库查询时,我们经常会遇到clob类型的数据,这是一种用于存储大型字符数据的数据类型。在一些情况下,我们可能需要将clob类型的数据转换为字符类型,以便进行一些操作
    的头像 发表于 11-21 11:31 778次阅读

    linux修改用户名的命令

    在Linux中修改用户名可以使用用户管理命令usermod来执行,下面将详细介绍如何修改Linux系统中的用户名。 用户名修改概述: 在Linux系统中,用户名是用于识别用户的唯一标识符。它们通常
    的头像 发表于 11-17 09:42 2353次阅读