成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

重構(gòu):一項常常被忽略的基本功

idealcn / 2392人閱讀

摘要:無論如何,單元測試一直是一中非常重要卻常常被忽視的技能。在實踐中,重構(gòu)的要求是很高的它需要有足夠詳盡的單元測試,需要有持續(xù)集成的環(huán)境,需要隨時隨地在小步伐地永遠讓代碼處于可工作狀態(tài)下去進行改善。

五月初的時候朋友和我說《重構(gòu)》出第 2 版了,我才興沖沖地下單,花了一個禮拜時間一口氣把它讀完后,才有了這篇書評。掩卷沉思,我無比贊同豆瓣網(wǎng)友“天心一”的評論:

這本書雖然很流行,但是應(yīng)該看它而沒有看的人,還是太多太多了。
一個老讀者的自白

作為一個開發(fā)者,2012年初識本書的時候,我在寫 Java;2019年本書再版,我在寫 JavaScript。真是應(yīng)了那句老話兒:“凡是可以用 JavaScript 來寫的應(yīng)用,最終都會用 JavaScript 來寫。”

JavaScript 特別適合重構(gòu),因為它很容易寫的無法維護。?

當(dāng)然這只是個玩笑,實際上作者也解釋過:重構(gòu)背后的理念和架構(gòu)適用于任何編程語言,選擇 JavaScript 只是因為它應(yīng)用的比較廣泛。無論使用哪種編程語言都可以寫出優(yōu)秀的或者糟糕的代碼,同樣也都可以以本書的思路和技巧進行重構(gòu)。

使用 JavaScript 展示代碼范例,并不意味這本書中介紹的技巧只適用于JavaScript。

對比新舊兩版,作者“重構(gòu)”了這本書:前幾章有所擴展,后幾章結(jié)構(gòu)調(diào)整較大,移除了原來的 12-14 章。總的來說,重構(gòu)后的第 2 版更接地氣、更適應(yīng)時代:不再有“大型重構(gòu)”,更多地聚焦操作的細(xì)節(jié)。

“Fowler 先生不僅沒有拔高,反而把功夫做得更扎實了?!薄宰g者序

雖然本書的副標(biāo)題是“改善既有代碼的設(shè)計”,但通讀全書之后,我覺得這本書對于設(shè)計新系統(tǒng)時如何避免“壞味道”也是很有指導(dǎo)意義的。

重構(gòu)和敏捷開發(fā)是一對親兄弟

提重構(gòu)就不能不提敏捷開發(fā),馬丁·福勒本身就是敏捷開發(fā)的發(fā)起者之一。敏捷作為“當(dāng)紅炸子雞”,與重構(gòu)有著很多相似的地方。

一是,這兩者都容易成為“掛羊頭,賣狗肉”中的“羊頭”,很多情況下,所謂的重構(gòu)就是抽出時間來重寫現(xiàn)有的幾乎無法維護的代碼,就如同很多“敏捷”只做到了“不拒絕需求變更”而沒有真正做到響應(yīng)變化;二是,它們實現(xiàn)起來都是一定難度且它們的實踐過程可以是交叉的——它們都著眼于具體細(xì)節(jié)而不是空架子,都?xì)g迎變化,都強調(diào)小步快走、持續(xù)改進;三是,敏捷開發(fā)很重要的兩個環(huán)節(jié)就是設(shè)計與重構(gòu),兩者相輔相成,彼此互補,在實踐的過程中保持較強的適應(yīng)力。

重構(gòu)的技巧

可以說,我在重構(gòu)過程中遇到的問題大多都能在本書中找到答案。

我們看看作者對重構(gòu)的定義:

重構(gòu)(名詞):對軟件內(nèi)部結(jié)構(gòu)的一種調(diào)整,目的是在不改變軟件可觀察行為的前提下,提高其可理解性,降低其修改成本。

重構(gòu)(動詞):使用一系列重構(gòu)手法,在不改變軟件可觀察行為的前提下,調(diào)整其結(jié)構(gòu)。

為何重構(gòu)、如何重構(gòu)、重構(gòu)的原則與手法,都可以在這本書中找到。從第 5 章起作者提供了多達 300 頁的重構(gòu)名錄、60 余項重構(gòu)的具體技巧(老版本是 70 多項,新版本移除了大規(guī)模項目的重構(gòu))。我覺得這一份非常詳盡的重構(gòu)手法清單更接近于字典,適合粗讀之后在用到的時候再具體查閱。

至于什么時候能夠用到這份名錄,作者在第 3 章也有介紹:當(dāng)代碼有了“壞味道”就可以著手進行重構(gòu)了。所謂“壞味道”,我認(rèn)為并非是一程不變的準(zhǔn)則,而是需要根據(jù)團隊、項目、采用的技術(shù)棧等各方面綜合得出的一種無法定量描述的經(jīng)驗。所以,作者用了“味道”這樣一種體驗來代指需要重構(gòu)的地方。在作者列出的每種“壞味道”中,都給出了對應(yīng)的重構(gòu)手法。雖然作者羅列的 20 多種“壞味道”覆蓋面很廣,但是你和你的團隊仍然可以總結(jié)出自己的經(jīng)驗來指導(dǎo)重構(gòu)。實際上,與第 1 版相比,第 2 版中的“壞味道”增加了“神秘命名”“全局?jǐn)?shù)據(jù)”“循環(huán)語句”,刪除了“不完美的庫類”。

我認(rèn)為本書最重要也最容易被忽略的章節(jié)就是第 4 章——構(gòu)筑測試體系。在第 4 章中,作者通過一個生產(chǎn)計劃的示例一步一步的構(gòu)建了一個完整的單元測試體系。顯然,掌握單元測試是有一定成本的,這就導(dǎo)致有些開發(fā)者(尤其是前端領(lǐng)域)完全不注重單元測試。他們認(rèn)為測試是QA的職責(zé),自己只需要保證冒煙測試通過即可。然而反直覺的是,良好的單元測試不但是重構(gòu)的先決條件和好幫手,而且能幫我們整理設(shè)計的思路,從而更好的寫出優(yōu)秀的代碼。因為在寫單元測試的時候,我們會假設(shè)自己是一個“代碼破壞者”,思考如何破壞代碼的運行、尋找那些可能出錯的邊界條件。單元測試的編寫和運行可以在寫完代碼后進行,也可以在寫代碼之前動手。先寫單元測試再寫代碼的技巧叫作測試驅(qū)動開發(fā)(TDD),也是敏捷開發(fā)的基石之一。關(guān)于TDD的技藝,作者的好友 Kent Beck 專門寫了一本書,即《測試驅(qū)動開發(fā)》。

作者在第 1 章的示例中提到:“小步快走,代碼永遠處于可工作狀態(tài)。”而且作者特意強調(diào):“每當(dāng)我要進行重構(gòu)的時候,第一個步驟永遠相同:我得確保即將修改的代碼擁有一組可靠的測試?!?/strong>

對于單元測試,我有一點小小的心得可以與大家分享:盡量編寫純函數(shù)。純函數(shù)是沒有副作用的函數(shù),給出同樣的參數(shù)值,純函數(shù)總是返回同樣的結(jié)果,它不依賴于參數(shù)以外的值。顯然,純函數(shù)更便于單元測試。

當(dāng)然單元測試也不是萬能的,它不可能檢出所有的bug,而且單元測試集的覆蓋率也是一個見仁見智的指標(biāo),具體需要寫多少單元測試,覆蓋多少代碼,都是需要我們在開發(fā)中結(jié)合實際情況自己權(quán)衡的。無論如何,單元測試一直是一中非常重要卻常常被忽視的技能。

另外,我在開發(fā)實踐中堅持一個“432”的原則,供大家參考:

一個類包括注釋代碼不要超過400行;

一個純函數(shù)最好不要超過30行;

函數(shù)內(nèi)循環(huán)嵌套最多2層。

重構(gòu)的現(xiàn)狀

有些朋友對“重構(gòu)”是不支持甚至是深惡痛絕的。

一部分開發(fā)者不愿意把精力“浪費”在重構(gòu)上

他們覺得重構(gòu)是“給飛行中的飛機修引擎”,有可能出現(xiàn)很多問題卻帶不來多少拿得出手的成績;重構(gòu)總是會在“不經(jīng)意間”破壞原有功能,帶來的麻煩很多,投入與收益完全不成比例,也很少會是面試的重點,花精力在這上面實在是費力不討好。

許多l(xiāng)eader反對盲目重構(gòu)

在創(chuàng)業(yè)公司里基本不會有重構(gòu)的呼聲,原因無須贅言;而在一些大企業(yè)里,leader們也不是都喜歡重構(gòu),因為花時間重構(gòu)意味著占用了開發(fā)新功能的時間,在代碼還能跑起來甚至看起來跑得還不錯的時候去重構(gòu)無疑是畫蛇添足;與重構(gòu)帶來的風(fēng)險相比,重構(gòu)帶來的好處就不是那么有說服力了。

大部分QA對重構(gòu)持謹(jǐn)慎的質(zhì)疑態(tài)度

代碼的變動意味著需要進行回歸測試,而敏捷當(dāng)?shù)赖臅r代,每個迭代中QA的關(guān)注重點都在新功能上,能夠分配給回歸測試的精力很有限,而在測試通過后的重構(gòu)極有可能導(dǎo)致此次變更對QA不透明,無形中增加了上線的風(fēng)險。

我認(rèn)為以上幾種反對重構(gòu)的場景都是不恰當(dāng)?shù)闹貥?gòu)導(dǎo)致的。

大家只是越來越接納“重構(gòu)”這個詞,因為這個詞聽起來很好,有一種積極應(yīng)對變化的感覺,但真正在做的還是跟以前一樣,毫無規(guī)矩的修改。

在實踐中,重構(gòu)的要求是很高的:它需要有足夠詳盡的單元測試,需要有持續(xù)集成的環(huán)境,需要隨時隨地在“小步伐地永遠讓代碼處于可工作狀態(tài)”下去進行改善。正是因為許多項目的“重構(gòu)”是在并不滿足以上條件也沒有經(jīng)過成本估算、策略規(guī)劃的情況下進行的,自然很容易導(dǎo)致失敗。

水土不服

實際上,還有一部分開發(fā)者雖然認(rèn)識到了重構(gòu)是提升代碼質(zhì)量的有效手段,是諸如“在當(dāng)下努力工作,以免日后有更多的活兒”此類觀念的具現(xiàn)。然而在某種程度上說,這在當(dāng)前996.icu大環(huán)境下是不適用的。關(guān)于這一點就只能見仁見智、自己衡量了。

沒有銀彈

最后,我想說一句: 沒有銀彈。

重構(gòu)和設(shè)計模式一樣,是對于最佳實踐的提煉,是一系列技巧的集合,它不是打通任督二脈的靈丹妙藥。如果你是一個有追求但卻從來沒有系統(tǒng)地了解過重構(gòu)的程序員(當(dāng)然我不相信世界上會有這種程序員),那你會發(fā)現(xiàn),你在日常工作中不經(jīng)意間已經(jīng)用過了這本書中提到的各種重構(gòu)手法。

重構(gòu)是注重實踐的技藝,僅僅了解其理念而忽視實踐則有如摶沙作飯,白費心思;而企圖把它當(dāng)做“萬金油”來解決所有問題也只會陷入不恰當(dāng)重構(gòu)的陷阱,最終得不償失。只有在合適的場景下恰當(dāng)?shù)膶嵺`,才會實現(xiàn)其應(yīng)有的價值。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/104392.html

相關(guān)文章

  • 重構(gòu)改善既有代碼設(shè)計(代碼壞味道)

    摘要:壞的味道指的是應(yīng)該被修改,被重構(gòu)的代碼,不具有可讀性,復(fù)用性,判斷邏輯復(fù)雜,冗余代碼。它們通常能指出代碼用途和實現(xiàn)手法之間的語義距離。把所有和這個變量相關(guān)的代碼新建一個類放入。但這往往不夠,請反復(fù)運用將某些行為移入類,直到者的協(xié)議一致為止。 壞的味道:指的是應(yīng)該被修改,被重構(gòu)的代碼,不具有可讀性,復(fù)用性,判斷邏輯復(fù)雜,冗余代碼。應(yīng)該使用各種重構(gòu)的手法去改變它! Duplicated...

    Code4App 評論0 收藏0
  • 如何成為專業(yè)PHP開發(fā)者

    摘要:如何才能成為一名專業(yè)的開發(fā)者資深開發(fā)者在其博客上分享了一些心得。要想成為一個專業(yè)的程序員,首先要成為一個中級程序員。永遠不要低估陪伴的力量結(jié)論當(dāng)你專注于實踐上面所提到各種方法的時候,你就在成為專業(yè)開發(fā)者的路上。 如何才能成為一名專業(yè)的PHP開發(fā)者?資深Web開發(fā)者Bruno Skvorc在其博客上分享了一些心得。 showImg(http://segmentfault.com/img...

    617035918 評論0 收藏0
  • 這幾個編碼小技巧將令你 PHP 代碼更加簡潔

    摘要:類型檢測類型檢測也是一種讓代碼簡潔的小技巧。上文中,我們只是嘗試搜集了一些例子,在這些例子里,你只需做出一點小的努力,就可以讓你的代碼變得更好更簡潔。 showImg(https://segmentfault.com/img/remote/1460000013847223); 保持代碼簡潔和高可讀性遠遠要比我們想象的要難,有時候甚至比持續(xù)架構(gòu)設(shè)計都要難。這里收集了一些可能對你重構(gòu)代碼有...

    Pikachu 評論0 收藏0
  • StarGAN——生成你明星臉

    摘要:生成你的明星臉介紹,叫做生成對抗網(wǎng)絡(luò)。改進損失函數(shù)為了訓(xùn)練過程穩(wěn)定,生成高質(zhì)量的圖像,論文中采用自定義梯度懲罰來代替對抗誤差損失其中表示真實和生成圖像之間均勻采樣的直線,試驗時。 StarGAN——生成你的明星臉 1 GAN 介紹 GAN,叫做生成對抗網(wǎng)絡(luò) (Generative Adversarial Network) 。其基本原理是生成器網(wǎng)絡(luò) G(Generator) 和判別器網(wǎng)...

    vvpale 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<