在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

    文章

    4807

    瀏覽量

    68802
收藏 人收藏

    評論

    相關推薦

    在華為云上通過 Docker 容器部署 Elasticsearch 并進行性能評測

    前言 ? 1. 華為云X實例介紹及優勢 ? 1.1 柔性算力 ? 1.2 vCPU和內存的靈活配比 ? 1.3 成本效益與性能 ? 2. 安裝并運行 Docker ? 2.1 修改倉庫配置文件
    的頭像 發表于 01-13 13:36 ?42次閱讀
    在華為云上通過 Docker 容器部署 <b class='flag-5'>Elasticsearch</b> 并進行性能評測

    OpenHarmony通過掛載鏡像來修改鏡像內容,RK3566鴻蒙開發板演示

    OpenHarmony通過掛載鏡像來修改鏡像內容的教程,提高修改鏡像內容效率!
    的頭像 發表于 01-03 14:21 ?141次閱讀
    OpenHarmony通過掛載鏡像來<b class='flag-5'>修改</b>鏡像內容,RK3566鴻蒙開發板演示

    構建高效搜索解決方案,Elasticsearch &amp; Kibana 的完美結合

    前言 構建高效搜索解決方案,FlexusX 服務器與 Elasticsearch & Kibana 的完美結合,為企業帶來云端搜索新體驗。FlexusX 實例以其卓越性能與靈活擴展性,確保高并發搜索
    的頭像 發表于 12-27 13:48 ?101次閱讀
    構建高效搜索解決方案,<b class='flag-5'>Elasticsearch</b> &amp; Kibana 的完美結合

    Elasticsearch 再次開源

    Elasticsearch 和 Kibana 又可以被稱為開源了。很難表達這句話讓我有多高興。我激動得簡直要跳起來了。我們 Elastic 的所有人都是如此。開源是我的 DNA。這也是Elastic的DNA。能夠再次將 Elasticsearch 稱為開源,我感到非常高興
    的頭像 發表于 11-13 12:14 ?161次閱讀
    <b class='flag-5'>Elasticsearch</b> 再次開源

    如何通過U盤修改安卓開機logo

    本文介紹如何通過U盤修改安卓開機logo,適用于亮鉆所有型號主板哦。
    的頭像 發表于 10-11 10:21 ?362次閱讀
    如何通過U盤<b class='flag-5'>修改</b>安卓開機logo

    統一日志數據流圖

    統一日志數據流圖 日志系統數據流圖 系統進行日志收集的過程可以分為三個環節: (1)日志收集和導入ElasticSearch (2)ElasticSearch進行索引等處理 (3)可視化操作,查詢等
    的頭像 發表于 08-21 15:00 ?328次閱讀
    統一日志數據流圖

    無法在PCB中選擇要復制、刪除或修改的特定對象

    如果PCB中存在無法復制、刪除或修改的特定對象,則原因可能是多重過濾/鎖定程序阻止了無意選擇和修改對象的操作。
    的頭像 發表于 07-26 09:14 ?3060次閱讀
    無法在PCB中選擇要復制、刪除或<b class='flag-5'>修改</b>的特定對象

    如何修改buildroot和debian文件系統

    本文檔主要介紹在沒有編譯環境的情況下,如何修改buildroot和debian文件系統方法,如在buildroot文件系統中添加文件、修改目錄等文件操作,在debian文件系統中,安裝軟件庫、工具、擴大文件系統空間等等操作。
    的頭像 發表于 07-22 17:46 ?521次閱讀
    如何<b class='flag-5'>修改</b>buildroot和debian文件系統

    變頻器功率修改方法

    ? ? ? 本文主要介紹變頻器功率修改方法,主要介紹常用牌子及其型號,希望對業內人士有所幫助。變頻器功率修改有什么好處?很多牌子的變頻器電源板、驅動板、主板都可以通用,只要型號、體積、硬件一樣,可以
    的頭像 發表于 07-21 16:55 ?1535次閱讀
    變頻器功率<b class='flag-5'>修改</b>方法

    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

    char是有符號類型還是無符號類型

    看一個C語言的筆試題,題目很簡單,問char是有符號類型還是無符號類型
    的頭像 發表于 03-17 10:15 ?1285次閱讀

    arcgis值類型與字段類型不兼容

    ArcGIS是一個地理信息系統軟件,可以用來處理、分析和可視化地理數據。在ArcGIS中,值類型和字段類型之間需要相互匹配,否則會導致不兼容的錯誤。 在ArcGIS中,值類型是指存儲在數據字段中
    的頭像 發表于 02-25 11:14 ?1787次閱讀

    Rust編寫的首個Postgres基礎Elasticsearch開源替代品問世

    ,Firebase 開源替代 Supabase,AirTable 開源替代 NocoDB,等等等等,現在又多了 ElasticSearch 開源替代 —— ParadeDB。
    的頭像 發表于 02-22 11:34 ?899次閱讀
    Rust編寫的首個Postgres基礎<b class='flag-5'>Elasticsearch</b>開源替代品問世
    主站蜘蛛池模板: 一色屋成人免费精品网站| 男啪女色黄无遮挡免费视频| 天堂8中文在线bt| 男男h全肉耽污| 中文字幕一区在线观看| 91男女视频| 久久精品re| 性日韩| 色多多a| 久久综合九色婷婷97| 国产乱人视频免费播放| 在线视频 亚洲| 手机看片1024免费视频| 国产午夜久久影院| 国产黄视频在线观看| 精品无码中出一区二区| 亚洲爱爱网站| 欧美日韩一区二区三区视频| 国模吧新入口| 天天爽夜夜爽人人爽一区二区| 国产午夜精品久久久久| 中文字幕色婷婷在线精品中| 成人国产三级在线播放| 深爱五月婷婷| 激情婷婷六月| 亚洲激情视频网站| 国产伦一区二区三区免费| 亚洲日本免费| 亚洲ay| 久久亚洲一级毛片| 夜夜爽毛片| www天天操| 最新久久免费视频| 日本免费福利视频| 成人在线91| 国产乱码精品一区二区三 | 真爽~张开腿~让我插| 字幕网中文aⅴ资源站| 日本高清黄色| 一本大道加勒比久久综合| 草综合|