91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

Elasticsearch Mapping類型修改

京東云 ? 來源:jf_75140285 ? 作者:jf_75140285 ? 2024-08-09 16:00 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

原創(chuàng)聲明:該文章是個人在項目中親歷后的經(jīng)驗總結(jié)和分享,如有搬運需求請注明出處。 這是“深入淺出系列”文章的第一篇,主要記錄和分享程序設計的一些思想和方法論,如果讀者覺得所有受用,還請“一鍵三連”,這是對我最大的鼓勵。

一、老生常談,到底啥是可讀性

一句話:見名知其義。有人說好的代碼必然有清晰完整的注釋,我不否認;也有人說代碼即注釋,是代碼簡潔之道的最高境界,我也不否認。但我都不完全接受,如果照搬前者,有人會在每個方法、每個循環(huán)、每個判斷都添加大量注釋,對于一個表達不嚴謹?shù)腸oder來說,代碼與漢字可能詞不達意;而且,一旦代碼邏輯發(fā)生變化,注釋改不改?對于后者,英語水平可能也就是個半吊子,動詞名詞不區(qū)分,真能做到代碼即注釋的有多少人?

二、罵歸罵,總歸要硬著頭皮干

先來舉個簡單例子:

public StepExitEnum doExecute(StepContext stepContext) throws Exception {
    String targetFilePath = this.getOriginFilePath(stepContext.getJobContext());//獲取目標路徑
    File targetDir = new File(targetFilePath);
    if (!targetDir.exists()) {
        targetDir.mkdirs();//如果不存在目錄則創(chuàng)建
    }

    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);//創(chuàng)建FileEncryptor
    Stream.of(encryptedFiles)
            .forEach(encryptFile -> {
                File targetFile = new File(targetFilePath, encryptFile.getName());
                dencryptor.invoke(encryptFile, targetFile);//解密文件
            });

    return StepExitEnum.CONTINUING;
}

這種代碼很常見,耐著性子其實也容易看懂:創(chuàng)建目錄->讀取加密文件->解密文件,就當前來說其實滿足了業(yè)務需求也就可以了,但不夠優(yōu)雅,從長期來講,這會產(chǎn)生bad smell,首先,“如果不存在目錄則創(chuàng)建”、“獲取文件名”這類注釋有何意義?有可能這是coder當時的方案思路,但這里真的需要嗎?它確確實實影響我的注意力了,但我沒有獲取到任何有價值信息;其次,若想要理解doExecute這個方法的目的,必須通讀代碼,而我只是想知道它做了什么事;最后,這個方法如果某一行出問題了,那么影響范圍是整個業(yè)務流程。

如果后期需要改動,大部分人可能會增加條件判斷,或是在后面繼續(xù)追加代碼實現(xiàn),最后會導致越來越難以閱讀,這其實也就是“能運行就不要動它”這個梗的根源了,因為沒人能讀明白它到底做了什么,但又不得不改,同時可能伴隨著“口吐芬芳”。

三、意識先行,從一行做起

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

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

先不論具體實現(xiàn)細節(jié),是不是一眼看過之后就了解doExecute做了什么事?這個方法的確沒有任何注釋,是否影響閱讀?其實我做的只是把先前的代碼重新歸類,分別放到了三個方法中,核心實現(xiàn)還是原本的代碼,沒有改動,現(xiàn)在閱讀起來是不是順暢了許多?

通讀代碼后我發(fā)現(xiàn)其實只做了三件事:創(chuàng)建目錄、讀取加密文件、解密文件,這是最核心的三個步驟,把它抽象出來,獨立為方法,既表達了邏輯功能,也清晰閱讀,還可以縮小影響范圍,今后哪里有問題改哪里,不需要再通讀代碼了。

四、回到主題,再說可讀性

(1)抽象,合理的業(yè)務邏輯抽象

“一個方法只應該做一件事”,想必很多人聽過類似的表述,聽起來簡單做起來難,怎么定義“只做一件事”?這件事的邊界是什么?這就依賴coder對業(yè)務邏輯、對功能實現(xiàn)的深入理解和合理抽象,這才能清晰的區(qū)分出各個功能的邊界,或者說是如何定義這件“事”。

沒有基于業(yè)務的合理抽象,硬生生地寫了幾個方法,你會發(fā)現(xiàn)這幾個方法“藕斷絲連”,一個方法的參數(shù)變化總會影響到另一個方法,很難將一個方法單拎出來應用在其他場景,一處改,處處改,這時候就要考慮,方法抽象的是否合理?

合理的抽象,從功能角色、職責劃分上就很清晰,有了這個基礎,才能清晰的編寫業(yè)務邏輯代碼,而不是堆砌各種條件判斷和循環(huán),同時帶著兩條斜杠和注釋,這是可讀性的基礎。

(2)各司其職,職責單一

一個方法只做一件事,擴展到一個類也如此,職責單一,歸根結(jié)底還得基于合理的抽象,所以,它其實是抽象的一種具體體現(xiàn),二者總是相輔相成。

(3)命名規(guī)范

這也是老生常談了,但真正做到的coder其實不多,類名、方法、變量的命名規(guī)則其實很有講究,但這不是本文的主題,不多贅述,類名用名詞,方法名用動詞,因為類表述的是做什么事,而方法名表述的是如何做,規(guī)范的命名和正確的詞法,這是編碼的基礎功底,這會有助于他人閱讀代碼,當然也是為什么我們讀spring源碼會感覺順暢,而讀同事寫的業(yè)務代碼卻很蹩腳的原因,我們太過于強調(diào)spring的IOC了,卻忽略了最基礎的東西。

(4)關鍵注釋

注釋不能少,但也不應該每個方法、每個判斷、每個循環(huán)到處都是//和/*,畢竟代碼是主體不是注釋,而且這樣還會帶來隱性的工作量問題:代碼修改,注釋也必須修改。所以好的注釋不是多,是關鍵。例如java.util.HashMap類的注釋上會告訴你線程安全問題:

Note that this implementation is not synchronized.

這是很關鍵的信息,所以注釋要給出關鍵性的、使用上注意的事項,不在于多。

代碼可讀性其實是一個比較寬泛的問題,也是一個老生常談的問題,隨著編碼經(jīng)驗積累,在不同職業(yè)階段,我們對可讀性都會有不同的理解和認識,本文從我自己的角度和經(jīng)驗,討論了一些比較淺的理解,如何寫出易讀、易懂的優(yōu)秀代碼,可能是我們coder永遠追尋的目標之一,即使它沒有終點。

最后別忘了“一鍵三連”!

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 代碼
    +關注

    關注

    30

    文章

    4973

    瀏覽量

    74149
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Linux中如何修改ddr的分配容量

    在 U-Boot 中修改 DDR 容量通常涉及以下幾個步驟,尤其是在嵌入式系統(tǒng)中,當更換或升級DDR內(nèi)存芯片后:
    的頭像 發(fā)表于 01-30 16:49 ?1439次閱讀

    從0到1搭建實時日志監(jiān)控系統(tǒng):基于WebSocket + Elasticsearch的實戰(zhàn)方案

    低成本、實時性高的日志監(jiān)控系統(tǒng)。 2. 技術選型 數(shù)據(jù)存儲 :Elasticsearch(高效檢索與聚合) 實時推送 :WebSocket(全雙工通信,避免HTTP輪詢) 后端服務 :Node.js
    發(fā)表于 01-09 16:43

    電能質(zhì)量在線監(jiān)測裝置的數(shù)據(jù)壓縮存儲功能支持的數(shù)據(jù)格式可以修改嗎?

    電能質(zhì)量在線監(jiān)測裝置的數(shù)據(jù)壓縮存儲功能支持的數(shù)據(jù)格式 部分可修改 ,具體取決于格式類型(數(shù)據(jù)文件格式 / 壓縮算法格式)與廠家設計,核心結(jié)論如下: 一、數(shù)據(jù)格式的可修改性分類 格式類型
    的頭像 發(fā)表于 12-11 16:39 ?1144次閱讀
    電能質(zhì)量在線監(jiān)測裝置的數(shù)據(jù)壓縮存儲功能支持的數(shù)據(jù)格式可以<b class='flag-5'>修改</b>嗎?

    多個Vector同類型VN設備固定硬件通道分配問題

    在同類型VN設備(如多個1640A)同時使用時,出現(xiàn)再次運行工程時,硬件通道和邏輯通道不匹配的情況。需要手動再次匹配,影響使用體驗和效率,此時需要重新“channel mapping”,當涉及到一個測試臺架有多個VN設備時,極其影響使用體驗,增加工作量。
    的頭像 發(fā)表于 11-02 17:08 ?1278次閱讀
    多個Vector同<b class='flag-5'>類型</b>VN設備固定硬件通道分配問題

    工業(yè)相機的類型及不同類型的應用

    工業(yè)相機根據(jù)不同的分類標準,可分為多種類型,每種類型都有其獨特的應用場景。
    的頭像 發(fā)表于 08-29 17:07 ?859次閱讀
    工業(yè)相機的<b class='flag-5'>類型</b>及不同<b class='flag-5'>類型</b>的應用

    一文讀懂!掃描電鏡mapping圖如何助力靜電紡絲纖維結(jié)構(gòu)觀察

    在微觀世界的探索中,材料的宏觀性能究竟由其微觀世界中哪些區(qū)域的哪些元素所決定?掃描電鏡mapping圖為我們深入了解材料的微觀結(jié)構(gòu)和成分分布提供了獨特視角,尤其在靜電紡絲纖維結(jié)構(gòu)觀察方面,有著
    的頭像 發(fā)表于 08-29 11:49 ?1577次閱讀
    一文讀懂!掃描電鏡<b class='flag-5'>mapping</b>圖如何助力靜電紡絲纖維結(jié)構(gòu)觀察

    資訊 | TAC\IMEI 申請新增衛(wèi)星頻段和衛(wèi)星設備類型

    TAC\IMEI申請新增衛(wèi)星頻段和衛(wèi)星設備類型近期,全球移動通信系統(tǒng)協(xié)會(GSMA)通過TS.06和TS.30程序文件新增了衛(wèi)星頻段和設備類型等信息。自2025年8月13日起,TAC申請將執(zhí)行如下
    的頭像 發(fā)表于 08-20 18:02 ?1505次閱讀
    資訊 | TAC\IMEI 申請新增衛(wèi)星頻段和衛(wèi)星設備<b class='flag-5'>類型</b>

    SQL 通用數(shù)據(jù)類型

    SQL 通用數(shù)據(jù)類型 數(shù)據(jù)庫表中的每個列都要求有名稱和數(shù)據(jù)類型。Each column in a database table is required to have a name and a
    的頭像 發(fā)表于 08-18 09:46 ?759次閱讀

    操作說明|修改DJZ1226直流電能表通訊地址

    非必要,不修改。
    的頭像 發(fā)表于 07-11 14:58 ?642次閱讀
    操作說明|<b class='flag-5'>修改</b>DJZ1226直流電能表通訊地址

    Linux系統(tǒng)查看及修改設備型號信息,觸覺智能RK3562開發(fā)板演示

    本文介紹Linux系統(tǒng)如何查看及修改設備型號信息的方法,適用于想查看設備型號信息或者想將設備型號信息修改為自己項目的名稱的情況。觸覺智能RK3562開發(fā)板演示。查看設備信息命令如下:cat/proc
    的頭像 發(fā)表于 06-19 15:58 ?1081次閱讀
    Linux系統(tǒng)查看及<b class='flag-5'>修改</b>設備型號信息,觸覺智能RK3562開發(fā)板演示

    如何二進制安裝Linux集群

    ElasticSearch是使用Java語言開發(fā)的,所以運行時依賴JDK。
    的頭像 發(fā)表于 06-17 14:49 ?920次閱讀

    可以在哪里修改以更改非 PD 類型 C 中不同的 Rp 等級?

    ,但在 C 類型中不是 PD pd_typec_en_rp ();函數(shù)對 Rp 等級沒有影響,那么我們可以在哪里修改以更改非 PD 類型 C 中不同的 Rp 等級? 還建議一種在非 pd sink 連接
    發(fā)表于 05-27 07:16

    單節(jié)點Elasticsearch+Filebeat+Kibana安裝指南

    單節(jié)點Elasticsearch+Filebeat+Kibana安裝指南
    的頭像 發(fā)表于 05-21 11:06 ?1273次閱讀
    單節(jié)點<b class='flag-5'>Elasticsearch</b>+Filebeat+Kibana安裝指南

    基于RV1126開發(fā)板修改CAN內(nèi)核設備樹

    編輯設備樹文件,執(zhí)行以下指令可以修改nano的板級頭文件,如下圖所示。(比如基于MCP2515把復用為SPI1的硬件資源轉(zhuǎn)成CAN對源代碼進行修改
    的頭像 發(fā)表于 04-17 10:10 ?830次閱讀
    基于RV1126開發(fā)板<b class='flag-5'>修改</b>CAN內(nèi)核設備樹

    基于RV1126開發(fā)板修改GPIO內(nèi)核設備樹

    編輯設備樹文件,執(zhí)行以下指令可以修改nano的板級頭文件,如圖所示。(比如把復用為SPI1的硬件資源改成通用的GPIO對源代碼進行修改
    的頭像 發(fā)表于 04-17 10:00 ?842次閱讀
    基于RV1126開發(fā)板<b class='flag-5'>修改</b>GPIO內(nèi)核設備樹