當(dāng)前位置: 首頁(yè) > 培訓(xùn)動(dòng)態(tài) > 編程資訊 > 新聞內(nèi)容

真正的代碼可讀性并不存在!但當(dāng)它真的發(fā)生時(shí)你會(huì)感覺(jué)到

童程童美少兒編程教育致力于打破經(jīng)濟(jì)門(mén)檻。學(xué)費(fèi)10000-25000元,平均每堂課200-300元,確保編程教育對(duì)每個(gè)孩子都是可及的。我們通過(guò)網(wǎng)上公示機(jī)構(gòu)信息,構(gòu)建透明宣傳,幫助家長(zhǎng)全面了解學(xué)校。擁有經(jīng)驗(yàn)豐富的師資團(tuán)隊(duì),提供富有創(chuàng)意的學(xué)習(xí)環(huán)境,多地校區(qū)讓學(xué)生更輕松地融入學(xué)習(xí)。關(guān)注學(xué)生的實(shí)際成績(jī)和學(xué)習(xí)效果,積極收集學(xué)員家長(zhǎng)的反饋,家長(zhǎng)的正面評(píng)價(jià)是我們成功的佳體現(xiàn)。

較近經(jīng)常提出什么是代碼可讀性(通常作為神秘 DX 的一部分)的問(wèn)題。越來(lái)越多的人開(kāi)始說(shuō)可讀性純粹是一個(gè)偏好問(wèn)題。我不能責(zé)怪他們。經(jīng)過(guò)多年的發(fā)展,我們可能會(huì)認(rèn)為我們已經(jīng)完全有能力感知不同質(zhì)量、范式和語(yǔ)言的不同代碼。我們也可以習(xí)慣那些起初讓我們覺(jué)得不舒服的工具。并得出結(jié)論:一切都取決于經(jīng)驗(yàn)!嗯,是的,也不是。

這是一把雙刃劍

佐丁較近表示:這種質(zhì)量有兩個(gè)目的——代碼的可讀性和可維護(hù)性如何,以及程序員的熟練程度如何

你知道,我對(duì)這個(gè)觀點(diǎn)有些滿意。它本可以就此打住,但后來(lái) Tsodin 對(duì)程序員本身進(jìn)行了更多的掩蓋,并將一切都簡(jiǎn)化為廣義的“git gud”。

這個(gè)說(shuō)法的問(wèn)題在于,我們有點(diǎn)含蓄地說(shuō)——任何代碼都是可讀的,只是你沒(méi)有足夠的技能!老實(shí)說(shuō):并非所有代碼本身都是可讀的。

哦,但是你能定義什么是可讀性嗎?

您可能經(jīng)常聽(tīng)到這樣的問(wèn)題:“您能定義可讀性嗎?不,不,不僅僅是可讀性,還有代碼可讀性,這是完全不同的,你知道。»

事實(shí)上,根據(jù)定義,可讀性分為多文字表現(xiàn)和文本的語(yǔ)言特征。但我們不是來(lái)評(píng)估字體或連字對(duì)代碼可讀性的貢獻(xiàn),對(duì)嗎?

我們真正感興趣是代碼的語(yǔ)言方面:

  • 命名;
  • 句法結(jié)構(gòu)的復(fù)雜性;
  • 抽象程度;
  • ETC。

“是的,這些都是偏好。” 不,他們不是。因?yàn)榇a和文本之間有一個(gè)重要的區(qū)別:與文本不同,代碼有義務(wù)實(shí)現(xiàn)其意圖。文本是否達(dá)到其目的實(shí)際上并不那么重要。例如,作者試圖通過(guò)文本傳達(dá)的想法或概念。如果他們不喜歡,那么,這只是一個(gè)糟糕的文本。它仍然在那里,文字是相關(guān)的,只是不善于表達(dá)思想。但代碼必須解決預(yù)期的問(wèn)題,否則它就是字面意義上的錯(cuò)誤且不適用。不好≠錯(cuò)誤。

所有這些可能使我們相信代碼可讀性實(shí)際上是一種復(fù)合現(xiàn)象:

  • 它包括問(wèn)題的正確解決方案;
  • 它完整??地描述了工作算法(即,它實(shí)際上并沒(méi)有對(duì)我們的意圖撒謊;)
  • 并且這個(gè)解決方案的可讀性較大程度地與問(wèn)題本身成正比。

代碼可讀性并不是你想象的那樣

請(qǐng)注意我們?nèi)绾螐?ldquo;代碼可讀性”切換到“解決方案可讀性”?我相信這是表征可讀性問(wèn)題的主要特征:我們?cè)噲D在沒(méi)有上下文的情況下看待這個(gè)術(shù)語(yǔ)。當(dāng)我們嘗試判斷代碼的可讀性時(shí),許多人主要判斷代碼本身,而不是它試圖解決的問(wèn)題。這就是爭(zhēng)論開(kāi)始的地方:過(guò)程性代碼比函數(shù)式代碼更具可讀性,聲明性代碼比命令性代碼更清晰,繼承與組合以及一堆其他流行語(yǔ)。

您的編碼風(fēng)格可能對(duì)您來(lái)說(shuō)更具可讀性,但這并不意味著它可以形成可讀的解決方案。

現(xiàn)在,讓我們看一下非常簡(jiǎn)單(mb 太簡(jiǎn)單)的示例:

def calculate(bottom, top)
  return 0 if top < bottom
  sum = 0
  for number in bottom..top do
    next unless number % 2 == 0
    sum += number
  end
  sum
end

def calculate(bottom, top)
  (bottom..top).select(&:even?).sum
end

愚蠢的例子,對(duì)吧?但什么樣的代碼更具可讀性呢?你們中有些人會(huì)說(shuō)兩者都非常可讀。但他們真的是這樣嗎?正如您可能希望的那樣,較好個(gè)選項(xiàng)顯然比第二個(gè)選項(xiàng)包含更多不必要的認(rèn)知負(fù)擔(dān)。第二個(gè)選項(xiàng)您可以從左到右逐字閱讀并理解代碼的意圖。在前者中,您必須將眼睛和上下文從一段代碼切換到另一段代碼。同時(shí),你必須記住每次都要過(guò)濾你頭腦中的值,并記住*條件。

當(dāng)然,有些人可能會(huì)說(shuō)他們不熟悉第二個(gè)示例中的語(yǔ)言結(jié)構(gòu)。這就是開(kāi)發(fā)人員的經(jīng)驗(yàn)發(fā)揮作用的地方。這是您必須“git gud”來(lái)了解可以應(yīng)用什么、如何應(yīng)用它,甚至是否將某些工具應(yīng)用于解決方案的地方。但每一個(gè)這樣的構(gòu)造、每一個(gè)模式、每一個(gè)范式都與問(wèn)題無(wú)關(guān)。它只是為了幫助您解決問(wèn)題。

我并不是想說(shuō)函數(shù)式代碼更好?;蛘哒f(shuō)越短越好。是的,這些例子看起來(lái)沒(méi)什么大不了的。但它們確實(shí)表明了我的主要觀點(diǎn)——在較好種情況下,我們強(qiáng)迫開(kāi)發(fā)人員校對(duì)僅與解決問(wèn)題間接相關(guān)的代碼。按條件提前返還?這是一個(gè)實(shí)現(xiàn)細(xì)節(jié),與要解決的問(wèn)題無(wú)關(guān)。聲明一個(gè)帶有默認(rèn)值的變量?再說(shuō)一遍,這和我們的問(wèn)題有什么關(guān)系呢?循環(huán)內(nèi)的條件?又一個(gè)細(xì)節(jié)。即使循環(huán)本身也只是一個(gè)細(xì)節(jié)。代碼中的此類細(xì)節(jié)越多,它的可讀性就越差(而且很可能會(huì)如此)。

現(xiàn)在,你們中的一些人可能會(huì)說(shuō),這一切都取決于范式、語(yǔ)言結(jié)構(gòu)或開(kāi)發(fā)人員的經(jīng)驗(yàn),或者通常這就是編程的要點(diǎn)!但你混淆了兩件不同的事情:

  • 固有的復(fù)雜性
  • 附帶復(fù)雜性

什么復(fù)雜性?

我簡(jiǎn)單引用一下:

固有的復(fù)雜性——相關(guān)軟件試圖使實(shí)際問(wèn)題變得更簡(jiǎn)單、更好的難度。

附帶的復(fù)雜性——關(guān)于軟件的任何困難但不一定是困難的事情

附帶復(fù)雜性是由庫(kù)、框架、語(yǔ)言、范例、開(kāi)發(fā)人員偏好等引入的。固有復(fù)雜性是為了解決所選領(lǐng)域的基本問(wèn)題而必須做出的權(quán)衡。一個(gè)好的工程師會(huì)減少附帶的復(fù)雜性并嘗試接受和處理固有的復(fù)雜性。

所以不,如果您可以輕松理解#ifdefs每 5 行嵌套的代碼,或者您非常擅長(zhǎng)閱讀 ruby?? 元編程,并使用 eval 將類成員委托給抽象上下文 - 這并不意味著該代碼是可讀的?;蛘咭苍S是這樣。但較終只有你學(xué)會(huì)了閱讀一堆偶然的復(fù)雜性。而且,總的來(lái)說(shuō),這沒(méi)有什么問(wèn)題——這樣的代碼數(shù)量驚人,能夠理解它總比不理解好。但解決方案的可讀性與你無(wú)關(guān)

那么這不是一個(gè)偏好問(wèn)題嗎?

為什么不?畢竟,代碼對(duì)您個(gè)人來(lái)說(shuō)是否可讀取決于您的經(jīng)驗(yàn)和偏好。

但您的偏好絕不會(huì)影響解決方案的復(fù)雜性和可讀性。例如,您需要使用分片實(shí)現(xiàn)緩存集群,并能夠基于跳躍一致哈希按大小和數(shù)量重新分片(這將導(dǎo)致項(xiàng)目重新分配)。所有這些都應(yīng)該即時(shí)發(fā)生,停機(jī)。當(dāng)然,還有緩存快照、正確的驅(qū)逐策略和高命中率!這個(gè)領(lǐng)域本身已經(jīng)夠復(fù)雜了,為什么還要增加更多的復(fù)雜性和問(wèn)題,并稱之為別人的“技能問(wèn)題”呢?老實(shí)說(shuō),這在某種程度上仍然是不可避免的。但只是在某種程度上。因?yàn)檎_的解決方案之后的下一個(gè)目標(biāo)是盡可能減少附帶的復(fù)雜性和不必要的細(xì)節(jié)。所以,請(qǐng)停止通過(guò)偏好來(lái)證明難以掌握的代碼(而不是復(fù)雜的代碼)。

這完全取決于解決方案的可讀性。

本頁(yè)面由主體*哈爾濱童程童美少兒編程培訓(xùn)南崗校區(qū)*自行上傳,本網(wǎng)不對(duì)該頁(yè)面內(nèi)容(包括但不限于文字、圖片)真實(shí)性和知識(shí)產(chǎn)權(quán)負(fù)責(zé),如有侵權(quán)請(qǐng)聯(lián)系處理刪除qq:16720809  。
微信咨詢

微信掃碼,享更多好課