国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【深入淺出系列】之代碼可讀性

這篇具有很好參考價值的文章主要介紹了【深入淺出系列】之代碼可讀性。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

這是“深入淺出系列”文章的第一篇,主要記錄和分享程序設(shè)計的一些思想和方法論,如果讀者覺得所有受用,還請“一鍵三連”,這是對我最大的鼓勵。

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

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

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

先來舉個簡單例子:

public StepExitEnum doExecute(StepContext stepContext) throws Exception {
    String targetFilePath = this.getOriginFilePath(stepContext.getJobContext());//獲取目標(biāo)路徑
    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)建目錄->讀取加密文件->解密文件,就當(dāng)前來說其實滿足了業(yè)務(wù)需求也就可以了,但不夠優(yōu)雅,從長期來講,這會產(chǎn)生bad smell,首先,“如果不存在目錄則創(chuàng)建”、“獲取文件名”這類注釋有何意義?有可能這是coder當(dāng)時的方案思路,但這里真的需要嗎?它確確實實影響我的注意力了,但我沒有獲取到任何有價值信息;其次,若想要理解doExecute這個方法的目的,必須通讀代碼,而我只是想知道它做了什么事;最后,這個方法如果某一行出問題了,那么影響范圍是整個業(yè)務(wù)流程。

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

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

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

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

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

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

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

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

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

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

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

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

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

(3)命名規(guī)范

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

(4)關(guān)鍵注釋

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

Note that this implementation is not synchronized.

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

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

作者:京東科技 張宇

來源:京東云開發(fā)者社區(qū) 轉(zhuǎn)載請注明來源文章來源地址http://www.zghlxwxcb.cn/news/detail-677058.html

到了這里,關(guān)于【深入淺出系列】之代碼可讀性的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 提高代碼可讀性和可維護(hù)性的命名建議

    當(dāng)進(jìn)行接口自動化測試時,良好的命名可以提高代碼的可讀性和可維護(hù)性。以下是一些常用的命名建議: 變量和函數(shù)命名: 使用具有描述性的名稱,清晰地表達(dá)變量或函數(shù)的用途和含義。 使用小寫字母和下劃線來分隔單詞,例如? login_url 、 send_request 。 避免使用單個字符或

    2024年02月10日
    瀏覽(45)
  • 50個簡潔的提示提高代碼可讀性和效率(0-10)

    這篇文章整理了50個簡潔的提示,可以提高您的代碼可讀性和效率。這些提示來自個人項目、徹底的代碼審查和與資深開發(fā)人員的啟發(fā)性討論。 無論您是新手還是經(jīng)驗豐富的開發(fā)人員,這篇文章都應(yīng)該能夠幫助您學(xué)到一些東西。 這個列表包括常見的Python模式、核心概念和最佳

    2024年02月10日
    瀏覽(19)
  • 編寫魅力十足的代碼:優(yōu)化可讀性、維護(hù)性和性能的關(guān)鍵

    本篇匯總了平時在工作開發(fā)中常遇到的業(yè)務(wù)邏輯的優(yōu)雅寫法,也匯總了自己還是新人時,拿到一個業(yè)務(wù)不知道怎么下手的痛點,依稀記得那時候總感覺自己寫的代碼不規(guī)范。 寫完之后,感覺還是美好的,又學(xué)到東西了。 采用簡潔的語法和結(jié)構(gòu),遵循一致的命名規(guī)范,具有良

    2024年02月10日
    瀏覽(22)
  • 炫技亮點 使用Optional類優(yōu)化代碼,提升可讀性和簡化空值處理

    在日常的軟件開發(fā)中,我們經(jīng)常需要處理可能為空的值,例如 從數(shù)據(jù)庫查詢數(shù)據(jù) 、 調(diào)用外部接口獲取數(shù)據(jù) 、 從配置文件讀取配置項 等。傳統(tǒng)的處理方式往往需要使用 繁瑣的空值判斷和異常處理 代碼,使得代碼變得冗長和難以理解。為了解決這個問題,Java 8 引入了 Optio

    2024年02月13日
    瀏覽(39)
  • 如何修改min.js或者壓縮后的js,以便提高代碼的可讀性。

    前端的js上線的時候一般會使用打包工具處理(webpack,gulp,ugly.js 等)。這樣做有幾點作用。 可以壓縮空間,提高頁面響應(yīng)速度 一定程度上可以保護(hù)自己的代碼安全,防止別人清晰看懂邏輯或者拷貝代碼。 提高別人閱讀自己代碼的門檻 可前端開發(fā)工作中多多少少,會需要看

    2024年02月11日
    瀏覽(18)
  • chatgpt賦能python:Python如何分行——提高代碼可讀性和效率的必備技能

    分行,即將一行長代碼分為多行,使得代碼更加易讀、易維護(hù)、易修改。 Python作為一門高級編程語言,具有簡潔、易讀、高效的特點。但在實際編程過程中,難免會遇到較長的代碼行,導(dǎo)致代碼可讀性下降,不利于程序員的開發(fā)和維護(hù)。因此,Python中分行技術(shù)就顯得尤為重要

    2024年02月08日
    瀏覽(33)
  • 【Spring MVC】獲取 @RequsetBody 標(biāo)識的對象,使用適配器模式增加代碼可讀性

    【Spring MVC】獲取 @RequsetBody 標(biāo)識的對象,使用適配器模式增加代碼可讀性

    一個技術(shù)需求引發(fā)的思考和實踐: 思考 用 AOP 把校驗代碼 實踐 用 Spring MVC 的 RequestBodyAdvice 做AOP邏輯 繼承 RequestBodyAdviceAdapter 實現(xiàn)自己的 適配器 用自己的適配器讓代碼可讀性增加 熟悉 Spring MVC 、Java 反射的一些實踐 本文內(nèi)容 澄清一個AOP校驗JSON內(nèi)容的思路 復(fù)習(xí)適配器模式

    2024年02月10日
    瀏覽(24)
  • chatgpt賦能python:Python分組:組織你的代碼,提升可讀性和可維護(hù)性

    chatgpt賦能python:Python分組:組織你的代碼,提升可讀性和可維護(hù)性

    在編寫代碼時,組織良好的代碼結(jié)構(gòu)和架構(gòu)是非常重要的。對于大規(guī)模的項目,特別是多人合作開發(fā)的項目來說,代碼管理和組織是至關(guān)重要的。Python 分組是一種常用的技術(shù),可以幫助我們組織代碼并提高代碼的可讀性和可維護(hù)性。 Python 分組指的是將一段代碼按照一定的邏

    2024年02月06日
    瀏覽(25)
  • CSDN首發(fā) | 《深入淺出OCR系列》目錄

    CSDN首發(fā) | 《深入淺出OCR系列》目錄

    ????? 作者簡介: CSDN、阿里云人工智能領(lǐng)域博客專家,新星計劃計算機視覺導(dǎo)師,百度飛槳PPDE,專注大數(shù)據(jù)與AI知識分享。? 公眾號:GoAI的學(xué)習(xí)小屋 ,免費分享書籍、簡歷、導(dǎo)圖等,更有交流群分享寶藏資料,關(guān)注公眾號回復(fù)“加群”或?? 點擊鏈接 加群。 ?? 專欄推

    2023年04月08日
    瀏覽(24)
  • 【SpringBoot深入淺出系列】SpringBoot之集成Elasticsearch

    【SpringBoot深入淺出系列】SpringBoot之集成Elasticsearch

    網(wǎng)上 SpringBoot 集成 Elasticsearch 的文章很多,但隨著 SpringBoot 和 Elasticsearch 版本的不斷升級,絕大多數(shù)文章使用的集成方式和調(diào)用的方法已經(jīng)過時,幾乎找不到能真正適用最新 SpringBoot 版本和最新 Elasticsearch 版本的文章。 本文正是基于最新 SpringBoot 版本和最新 Elasticsearch 版本實

    2024年02月06日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包