日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

停止使用花哨的技巧來編寫優(yōu)雅的代碼吧!

來源: 責(zé)編: 時(shí)間:2024-05-16 09:10:01 158觀看
導(dǎo)讀在技術(shù)社區(qū)經(jīng)常看到一些博客推廣各種編程語言的“高級特性”和“高級模式”,并利用這些特性提供一些“優(yōu)雅”的代碼。但是這種花里胡哨的東西真的可以提升我們的編碼效能嗎?恐怕 不是的!炫耀技能并不一定表明技術(shù)水平高

在技術(shù)社區(qū)經(jīng)常看到一些博客推廣各種編程語言的“高級特性”和“高級模式”,并利用這些特性提供一些“優(yōu)雅”的代碼。CNK28資訊網(wǎng)——每日最新資訊28at.com

但是這種花里胡哨的東西真的可以提升我們的編碼效能嗎?CNK28資訊網(wǎng)——每日最新資訊28at.com

恐怕 不是的!CNK28資訊網(wǎng)——每日最新資訊28at.com

炫耀技能并不一定表明技術(shù)水平高超

許多人以使用語言和框架的晦澀功能為榮,通過利用各種罕見的 API 來展示他們對框架的熟悉程度。CNK28資訊網(wǎng)——每日最新資訊28at.com

他們認(rèn)為自己的編程和技術(shù)能力比那些寫簡單邏輯的同學(xué)要高。甚至還會產(chǎn)生 “傲慢” 的情緒。CNK28資訊網(wǎng)——每日最新資訊28at.com

這種觀點(diǎn)是 非常錯誤 的!CNK28資訊網(wǎng)——每日最新資訊28at.com

我們來看下面的例子:CNK28資訊網(wǎng)——每日最新資訊28at.com

在招聘開發(fā)人員時(shí),存在一個有趣的現(xiàn)象,即:更高級別的申請人較少審查具體的編碼技能,而更多地審查架構(gòu)能力、業(yè)務(wù)理解和工程質(zhì)量。CNK28資訊網(wǎng)——每日最新資訊28at.com

請注意,理解架構(gòu)、業(yè)務(wù)和工程并不是關(guān)于溝通或管理等軟技能,這是工程師堅(jiān)實(shí)的專業(yè)能力。CNK28資訊網(wǎng)——每日最新資訊28at.com

另一方面,技術(shù)社區(qū)中最受歡迎的內(nèi)容通常是各種框架和庫的“入門指南”。CNK28資訊網(wǎng)——每日最新資訊28at.com

從暢銷的《XXX從初學(xué)者到專家》指南到《一步一步教你如何學(xué)習(xí)XXX》,最熱門的內(nèi)容仍然圍繞著如何操作這些API并應(yīng)用某些技術(shù)知識模式。CNK28資訊網(wǎng)——每日最新資訊28at.com

考慮到這些現(xiàn)象和一些常識,我們可以得出以下三個條件:CNK28資訊網(wǎng)——每日最新資訊28at.com

  • 程序員的級別越高,技能樹中技術(shù)知識所占的比例就越小。
  • 高級程序員的比例遠(yuǎn)小于初級程序員。
  • 在編程界,大多數(shù)人關(guān)心的是技術(shù)知識。

根據(jù)這些條件,我們可以做出一個寬松的推論:最關(guān)心和癡迷于編程技能的人很可能是大多數(shù)處于初級水平的程序員。 因此,炫耀技能并不一定表明技術(shù)水平高超。CNK28資訊網(wǎng)——每日最新資訊28at.com

需要澄清的是,我們并不認(rèn)為編程技能不重要。相反,高級程序員對技能的理解比初級程序員要深刻得多,許多熟練的代碼可以在數(shù)量級上優(yōu)化和解決問題。CNK28資訊網(wǎng)——每日最新資訊28at.com

那么我們應(yīng)該如何評估這樣的代碼呢?CNK28資訊網(wǎng)——每日最新資訊28at.com

能夠應(yīng)用各種高級功能的學(xué)生無疑被認(rèn)為是“聰明”的。然而,何時(shí)以及如何使用它們需要基于所謂“智慧”的判斷。CNK28資訊網(wǎng)——每日最新資訊28at.com

這與 Facebook 和 Google 的代碼標(biāo)準(zhǔn)中經(jīng)常看到的說法類似:CNK28資訊網(wǎng)——每日最新資訊28at.com

運(yùn)用你最好的判斷力。CNK28資訊網(wǎng)——每日最新資訊28at.com

雖然聽起來很悅耳,但這是一個形式上的概念。CNK28資訊網(wǎng)——每日最新資訊28at.com

下面我們將進(jìn)行一些更具體的討論并提取一些常見的技巧。CNK28資訊網(wǎng)——每日最新資訊28at.com

常見技巧

幸福的家庭都是相似的;每個不幸的家庭都有自己的不幸。CNK28資訊網(wǎng)——每日最新資訊28at.com

——列夫·托爾斯泰CNK28資訊網(wǎng)——每日最新資訊28at.com

好的代碼就像好的文學(xué)作品,壞的代碼有它自己的壞處。CNK28資訊網(wǎng)——每日最新資訊28at.com

如果我們使用“聰明的技巧”來評估一段代碼,那么這段代碼的質(zhì)量可能不是很好。對于使用各種技術(shù)的代碼,我們還可以找到許多這些技術(shù)應(yīng)用不佳的場景來表明它們各自的問題。CNK28資訊網(wǎng)——每日最新資訊28at.com

使用危險(xiǎn)的語義

很多人讀完《高級程序設(shè)計(jì)》之類的書后,都會將自己對高級功能的理解運(yùn)用到實(shí)際項(xiàng)目中去炫耀。在前端領(lǐng)域,這些行為包括但不限于:CNK28資訊網(wǎng)——每日最新資訊28at.com

  • 學(xué)習(xí) == 和 === 的區(qū)別,并在不同的情況下使用不同的符號進(jìn)行邏輯判斷。
  • 了解變量提升(var)行為后,使用它來實(shí)現(xiàn)特殊的代碼執(zhí)行序列。
  • 理解 prototype 和 constructor ,并利用它們實(shí)現(xiàn)各種繼承關(guān)系。
  • 掌握 this 指向的各種規(guī)則,并使用特殊的規(guī)則來綁定上下文。
  • ……

使用具有這些功能的代碼當(dāng)然可以運(yùn)行,但這里的問題是這些語義都是 危險(xiǎn)的,或者是語言設(shè)計(jì)問題造成的渣滓。CNK28資訊網(wǎng)——每日最新資訊28at.com

既然知道它們很難使用,并且有成熟的替代解決方案可用,為什么還要用它們來展示自己的技術(shù)技能呢? 然而在前端社區(qū),這樣的行為卻屢屢發(fā)生。CNK28資訊網(wǎng)——每日最新資訊28at.com

例如:CNK28資訊網(wǎng)——每日最新資訊28at.com

  • 僅了解各種規(guī)則this指向就足以寫一篇長文章(這在許多技術(shù)社區(qū)中一直是一個無聊的話題)。
  • 令人驚訝的是,像“==”這樣有無數(shù)陷阱的功能,很多人在閱讀博客后竟然想要 “合理” 地使用它們。
  • 至于變量提升,這種完全違反直覺的設(shè)計(jì)缺陷已被一些人用來創(chuàng)建各種花哨的面試問題。

當(dāng)然,這決不妨礙理解這些所謂的“高級功能”如何工作以及為什么它們會導(dǎo)致令人困惑的行為。CNK28資訊網(wǎng)——每日最新資訊28at.com

對于每個想要成長的可靠學(xué)生來說,學(xué)習(xí)它們很重要。這里給出的建議是:CNK28資訊網(wǎng)——每日最新資訊28at.com

  • 至少理解一次,達(dá)到能夠指出問題所在的程度。
  • 了解這些功能的替代解決方案,并了解如何避免陷阱。
  • 除非維護(hù)底層庫,否則在任何情況下都不要在代碼中使用它們。

每種編程語言在其開發(fā)過程中都不可避免地留下遺留問題。對于JS這樣一個一周誕生、向前兼容性要求非常高的語言來說,這個問題就更加嚴(yán)重了。CNK28資訊網(wǎng)——每日最新資訊28at.com

然而,隨著軟件工程的發(fā)展,這些設(shè)計(jì)缺陷帶來的危險(xiǎn)語義已經(jīng)慢慢淡入歷史。現(xiàn)在,像深入研究IE6兼容性問題一樣,深入學(xué)習(xí)、掌握和使用它們已經(jīng)逐漸過時(shí)了。CNK28資訊網(wǎng)——每日最新資訊28at.com

應(yīng)用設(shè)計(jì)模式

設(shè)計(jì)模式也是技術(shù)文章中非常常見的主題。CNK28資訊網(wǎng)——每日最新資訊28at.com

例如,很多文章都把《設(shè)計(jì)模式》中的幾十種模式應(yīng)用到了 JavaScript 中,用上面提到的各種“高級特性”來模擬這個、實(shí)現(xiàn)那個。最后,他們還夸夸其談,這些模式都是“優(yōu)秀程序員必知”,所以在簡歷上加上一句“精通各種設(shè)計(jì)模式”,就讓人印象深刻了!CNK28資訊網(wǎng)——每日最新資訊28at.com

設(shè)計(jì)模式的初衷是為了彌補(bǔ)Java等靜態(tài)語言的缺點(diǎn)。隨著編程語言的發(fā)展,許多“經(jīng)典”設(shè)計(jì)模式已經(jīng)成為語言機(jī)制的一部分。CNK28資訊網(wǎng)——每日最新資訊28at.com

比如:export 內(nèi)置對單例模式的支持,用函數(shù)層包裝內(nèi)容就是工廠模式,yield 也實(shí)現(xiàn)了迭代器模式等等。CNK28資訊網(wǎng)——每日最新資訊28at.com

此外,JS 的動態(tài)性使得 JSON 的靈活性大幅超越了反射,而一等公民的函數(shù)設(shè)計(jì)使得 JS 回調(diào)函數(shù)比 Java 的回調(diào)接口或類似 Visitor 的模式更加靈活。CNK28資訊網(wǎng)——每日最新資訊28at.com

很多提倡設(shè)計(jì)模式的文章之所以沒有傳播開來,是因?yàn)樗鼈內(nèi)藶榈刂圃炝瞬槐匾膹?fù)雜性,反而造成了一種誤解:“如果你不使用XX模式,就意味著你的技能缺乏”。CNK28資訊網(wǎng)——每日最新資訊28at.com

至少從我個人閱讀優(yōu)秀的開源項(xiàng)目源代碼來看,我還沒有發(fā)現(xiàn)機(jī)械應(yīng)用模式的實(shí)例;相反,需要解決的問題被清楚地描述,然后提供可讀的抽象。CNK28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)然,我們可以回顧性地識別其中的某些實(shí)施模式;然而,我更愿意相信作者并沒有以“這里我們需要使用XX模式”的心態(tài)來編碼。CNK28資訊網(wǎng)——每日最新資訊28at.com

許多缺乏經(jīng)驗(yàn)、缺乏洞察力的初學(xué)者可能會因?yàn)槿狈﹂喿x高質(zhì)量代碼的經(jīng)驗(yàn)或受到公司遺留項(xiàng)目中舊代碼的影響而最終遵循嚴(yán)格規(guī)定的方法。在我看來,這是相當(dāng)遺憾的。CNK28資訊網(wǎng)——每日最新資訊28at.com

減少代碼行數(shù)

我們都知道,通過復(fù)制粘貼生成的冗長且重復(fù)的代碼是不好的。CNK28資訊網(wǎng)——每日最新資訊28at.com

然而,大多數(shù)復(fù)制粘貼發(fā)生在期限緊迫且沒有時(shí)間進(jìn)行優(yōu)化的情況下。考慮到我們的工作強(qiáng)度,這是可以理解的。CNK28資訊網(wǎng)——每日最新資訊28at.com

另一方面,還有另一種極端行為,其目的是通過使用各種非常規(guī)手段來“簡化”代碼,從而達(dá)到“最簡潔”的代碼。CNK28資訊網(wǎng)——每日最新資訊28at.com

例如:CNK28資訊網(wǎng)——每日最新資訊28at.com

  • 剛開始學(xué)習(xí)函數(shù)式編程的同學(xué)可能對這樣的代碼情有獨(dú)鐘 a(b(c(d, e(f, g)))),認(rèn)為函數(shù)的深度嵌套可以大大減少中間變量,從而節(jié)省代碼量;
  • 有些學(xué)生喜歡用邏輯運(yùn)算符連接各種條件邏輯,并將它們?nèi)繉懺谝恍兄校?nbsp;a || b && c && d;
  • 同樣常見的情況是,實(shí)用程序函數(shù)最終會寫入越來越多的參數(shù),直到它們在一行中一次性傳遞。

我們再考慮一下這樣的代碼是否增強(qiáng)了可讀性:CNK28資訊網(wǎng)——每日最新資訊28at.com

  1. 深度嵌套的函數(shù)調(diào)用會帶來大量的右括號,例如:)))))),這在 Lisp 中長期以來一直受到批評;
  2. 單行條件邏輯不利于調(diào)試;
  3. 具有許多參數(shù)的函數(shù)往往表現(xiàn)復(fù)雜且難以調(diào)試。

這些編碼實(shí)踐可以輕松地替換為具有更好可讀性的表單,而無需太多麻煩。然而,故意創(chuàng)建這樣的代碼可能會讓后續(xù)的維護(hù)者感到不舒服。CNK28資訊網(wǎng)——每日最新資訊28at.com

對于有關(guān)換行和縮進(jìn)的具體實(shí)踐,JavaScript 標(biāo)準(zhǔn)樣式等工具可以有效地自動處理大多數(shù)情況。CNK28資訊網(wǎng)——每日最新資訊28at.com

隱式重寫常識

現(xiàn)代工程框架通常提供許多可定制的接口,允許開發(fā)人員輕松修改框架的行為。CNK28資訊網(wǎng)——每日最新資訊28at.com

例如:React 公開了上下文,而 Redux 和 MobX 等庫則利用此接口來極大地優(yōu)化深度prop傳遞的體驗(yàn)。CNK28資訊網(wǎng)——每日最新資訊28at.com

然而,框架內(nèi),存在許多隱含的約定和規(guī)范,當(dāng)在典型業(yè)務(wù)代碼中進(jìn)行不合理的定制時(shí),可能會導(dǎo)致重大挑戰(zhàn)。這些類型的修改通常發(fā)生在不顯眼的地方,但可能會產(chǎn)生很大的影響。CNK28資訊網(wǎng)——每日最新資訊28at.com

例如:在我們之前維護(hù)的一個項(xiàng)目中,進(jìn)行了巧妙的修改,React.Component用基類自己的XXX.BaseComponent行為替換了基類。CNK28資訊網(wǎng)——每日最新資訊28at.com

定制的組件并沒有涉及任何業(yè)務(wù)邏輯相關(guān)的改動,只是增加了一些莫名其妙的初始化代碼。CNK28資訊網(wǎng)——每日最新資訊28at.com

結(jié)果,有關(guān) React 組件 Base 的隱含常識變得無效。維護(hù)時(shí),乍一看,替換的組件似乎很普通。但是,修復(fù)就會導(dǎo)致問題。CNK28資訊網(wǎng)——每日最新資訊28at.com

此外,這些“黑魔法”代碼沒有評論或文檔,也不清楚為什么首先引入它們是為了解決什么問題。對于這樣的編碼做法,也許除了過于聰明之外,沒有其他合理的評價(jià)。CNK28資訊網(wǎng)——每日最新資訊28at.com

該項(xiàng)目的另一個例子涉及另一種“聰明”的做法:CNK28資訊網(wǎng)——每日最新資訊28at.com

window.fetch 根據(jù)請求路徑將其替換為三到四個不同的自定義版本。這意味著當(dāng)維護(hù)人員編寫新的獲取請求時(shí),他們不能依賴任何先前有關(guān)獲取的隱式知識,而是必須通過跟蹤前輩的自定義版本來進(jìn)行調(diào)試!CNK28資訊網(wǎng)——每日最新資訊28at.com

還有一些隱性做法會因副作用而出現(xiàn)問題。例如:當(dāng)看到 user = getUser(id) 時(shí),人們可能不會想到這個getUser函數(shù)不僅查詢用戶,而且還會默默地顯示一條提示消息發(fā)送請求,然后還清除當(dāng)前數(shù)據(jù)。CNK28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)然,在前端開發(fā)本身中,管理大量與 UI 相關(guān)的網(wǎng)絡(luò)副作用本質(zhì)上會增加復(fù)雜性。CNK28資訊網(wǎng)——每日最新資訊28at.com

然而,如果調(diào)用一個函數(shù)會導(dǎo)致許多級聯(lián)結(jié)果,導(dǎo)致復(fù)雜性進(jìn)一步增加,許多維護(hù)者可能會選擇棄用和重寫。CNK28資訊網(wǎng)——每日最新資訊28at.com

重新發(fā)明輪子

在技術(shù)社區(qū)中,經(jīng)常可以看到“最全的前端實(shí)用功能”之類的合集,而且點(diǎn)贊數(shù)往往很高。然而,500合1的小霸王游戲卡比超級馬里奧更好玩嗎?CNK28資訊網(wǎng)——每日最新資訊28at.com

我有幸讀過一些這樣的文章,發(fā)現(xiàn)這些封裝的函數(shù)往往甚至沒有固定的主題:左邊是“ getCookie”,右邊是“ deepClone”,上面是isEmail,下面是scrollTop。每個實(shí)現(xiàn)在將英文函數(shù)名翻譯成中文的層面上只有幾行注釋,沒有測試用例、依賴配置或文檔。它們被稱為“小而美”。CNK28資訊網(wǎng)——每日最新資訊28at.com

這樣的代碼值得復(fù)制到你的項(xiàng)目中以供重用嗎?坦白說,它們只是滿足“我能發(fā)明輪子”沖動的產(chǎn)品。CNK28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)然,我完全相信作者可以毫不費(fèi)力地寫出優(yōu)雅的內(nèi)容。但項(xiàng)目不是采訪;而是項(xiàng)目。對于一個穩(wěn)定可靠的庫,除了簡單的實(shí)現(xiàn)之外,還需要很多與代碼無關(guān)的東西。CNK28資訊網(wǎng)——每日最新資訊28at.com

根據(jù)《人月神話》中的布魯克斯定律,軟件項(xiàng)目中實(shí)際編碼時(shí)間只占1/6;剩余的大部分時(shí)間用于測試、文檔和溝通。對于具有更高質(zhì)量要求的庫代碼——從在線源匆忙編寫或復(fù)制(哦不!讓我們稱之為內(nèi)聯(lián))代碼是否足夠?CNK28資訊網(wǎng)——每日最新資訊28at.com

在正式項(xiàng)目中使用庫時(shí),如果穩(wěn)定的現(xiàn)有依賴項(xiàng)能夠令人滿意地滿足要求,那么顯然這應(yīng)該是您的首選。如果你遇到需要自己重新發(fā)明輪子的情況,那么請確保在可靠項(xiàng)目留下的 5/6 之外編寫代碼也做得很好;不要不必要地重復(fù)劣質(zhì)輪子。CNK28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-88386-0.html停止使用花哨的技巧來編寫優(yōu)雅的代碼吧!

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: C#中的“_ =”操作符:丟棄不需要的變量

下一篇: 面試官:你的系統(tǒng),是如何建模的?

標(biāo)簽:
  • 熱門焦點(diǎn)
  • Find N3入網(wǎng):最高支持16+1TB

    OPPO將于近期登場的Find N3折疊屏目前已經(jīng)正式入網(wǎng),型號為PHN110。本次Find N3在外觀方面相比前兩代有很大的變化,不再是小號的橫向折疊屏,而是跟別的廠商一樣采用了較為常見的
  • Mate60手機(jī)殼曝光 致敬自己的經(jīng)典設(shè)計(jì)

    8月3日消息,今天下午博主數(shù)碼閑聊站帶來了華為Mate60的第三方手機(jī)殼圖,可以讓我們在真機(jī)發(fā)布之前看看這款華為全新旗艦的大致輪廓。從曝光的圖片看,Mate 60背后攝像頭面積依然
  • 石頭智能洗地機(jī)A10 Plus體驗(yàn):雙向自清潔治好了我的懶癌

    一、前言和介紹專為家庭請假懶人而生的石頭科技在近日又帶來了自己的全新旗艦新品,石頭智能洗地機(jī)A10 Plus。從這個產(chǎn)品名上就不難看出,這次石頭推出的并不是常見的掃地機(jī)器
  • 企業(yè)采用CRM系統(tǒng)的11個好處

    客戶關(guān)系管理(CRM)軟件可以為企業(yè)提供很多的好處,從客戶保留到提高生產(chǎn)力。  CRM軟件用于企業(yè)收集客戶互動,以改善客戶體驗(yàn)和滿意度。  CRM軟件市場規(guī)模如今超過580
  • 三言兩語說透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是兩種很有用的技術(shù),可以幫助我們寫出更加優(yōu)雅、泛用的函數(shù)。本文將首先介紹柯里化和反柯里化的概念、實(shí)現(xiàn)原理和應(yīng)用
  • 微信語音大揭秘:為什么禁止轉(zhuǎn)發(fā)?

    大家好,我是你們的小米。今天,我要和大家聊一個有趣的話題:為什么微信語音不可以轉(zhuǎn)發(fā)?這是一個我們經(jīng)常在日常使用中遇到的問題,也是一個讓很多人好奇的問題。讓我們一起來揭開這
  • 蘋果、三星、惠普等暫停向印度出口筆記本和平板電腦

    集微網(wǎng)消息,據(jù)彭博社報(bào)道,在8月3日印度突然禁止在沒有許可證的情況下向印度進(jìn)口電腦/平板及顯示器等產(chǎn)品后,蘋果、三星電子和惠普等大公司暫停向印度
  • 首發(fā)天璣9200+ iQOO Neo8系列發(fā)布首銷售價(jià)2299元起

    2023年5月23日晚,iQOO Neo8系列正式發(fā)布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro強(qiáng)悍登場,限時(shí)售價(jià)3099元起;價(jià)位段最強(qiáng)性能手機(jī)iQOO Neo8同期上市
  • 世界人工智能大會國際日開幕式活動在世博展覽館開啟

    30日上午,世界人工智能大會國際日開幕式活動在世博展覽館開啟,聚集國際城市代表、重量級院士專家、國際創(chuàng)新企業(yè)代表,共同打造人工智能交流平臺。上海市副市
Top 主站蜘蛛池模板: 健康| 独山县| 尼勒克县| 莱州市| 忻城县| 隆德县| 石家庄市| 进贤县| 阳曲县| 西充县| 夏邑县| 肃北| 普定县| 齐齐哈尔市| 清新县| 嵊州市| 渝北区| 白山市| 洞口县| 同心县| 斗六市| 霸州市| 肇东市| 吉水县| 会同县| 犍为县| 乐都县| 舟曲县| 高台县| 楚雄市| 昌都县| 丹巴县| 正安县| 原平市| 阿城市| 那坡县| 阿合奇县| 新安县| 平定县| 凤冈县| 贵德县|