天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

重構 — 勿以善小而不為

  重構最大的敵人不是技巧與能力,而是懶惰,或者說是態度。許多細小的重構看似無足輕重,例如方法重命名、提取方法。即使重構了,似乎對代碼的結構也沒有太大的影響,于是就決定淡然處之,心里想“事情還未到不可挽回的地步,實現功能要緊,至于重構,還是以后再做吧!”這樣一想,于是就會滋生得過且過的想法,等到代碼開始變得一團糟時,重構已經變得無比困難了。此時需要的重構技巧,將百倍難于發現壞味道之初。

  在我參加的前一個項目中,我們定義了一個處理OrderSet的Controller。剛剛開始開發時,對于OrderSet的操作并不多,主要是Search與Count操作。OrderSet分為WithDetails與WithoutDetail兩種類型。為了實現的簡單,我們將這兩種類型的操作都放在一個Controller中。隨著操作的逐漸增多,這個Controller就變得越來越龐大,逐漸變得臃腫起來。每當我需要調用或者修改Controller時,我都在想:“嗯,這個代碼太糟糕了,什么時候給它重構一下。”想是這么想,卻一直扮演著說話的巨人,行動的矮子。即使興起這樣的念頭,又因為其他的工作將此念頭澆滅。直到有一天,這個Controller的代碼已經到了忍無可忍的地步,我和我的Pair終于達成一致意見,決定對此代碼進行手術。我們花費了近一天的時間對Controller以及相關的Repository進行了徹底的重構。重構前后的代碼天差地別,我終于可以不用像吃了蒼蠅那般看著代碼惡心了。這種重構后體驗到的愉悅簡直無與倫比,最關鍵是結果令人滿意,重構后的代碼變得更可讀,更簡單,也更容易增加新的功能。

  如今工作的項目,需要對遺留系統進行遷移。首要的任務是為此系統編寫BDD測試,以期搭建遷移的測試保護網,并能夠形成可讀與可工作的測試用例文檔。在開始接觸這個任務時,客戶方的開發人員已經基本搭建好了初步的框架。當我們在面對不良代碼時,第一個浮現在腦海中的念頭是“重構”,然而考慮到時間因素,隨之又強迫自己滅了這個念頭,因為我們需要考慮項目的進度。我們總是在這樣的取舍之中艱難前進,終于,在系統需要增加一個新消息的測試時,我強烈地感受到重構的迫在眉睫。即使代碼有諸多破窗,修補了一扇,總強過聽之任之。經過接近一天多的重構(當然還包括run tests以及build花費的時間),結果令人滿意。回顧這個過程,我發現在發現壞味道時,如果能及時地對代碼進行重構,并保證重構的小步前進,并不會阻礙開發進度,相反還能夠在一定程度改善代碼質量,提高代碼的可讀性、可重用性以及可擴展性。所謂“勿以善小而不為”,千萬不要因為小重構對代碼質量的影響微乎其微而輕視她,或者忽略她,又或者推遲到忍無可忍再想到重構。重構并非最后的救命稻草,而是隨時保持我們正確前進的一把尺子。

  說完了重構的重要性,讓我再來粗略地介紹這個重構過程。

  我們的測試程序主要針對Message的發送、接收與驗證。業務的處理則由部署在JBoss上的應用來處理。我們需要設定期望的Message,在發送請求到遠程系統后,接收返回的消息,并驗證消息以及數據庫是否符合我們的期望。重構的起因在于我們需要編寫新的測試覆蓋之前從未測試過的消息,其類型為SO08。如果沿用之前的實現,我們就需要在測試步驟中增加MessageType的分支,根據消息類型對返回的消息進行檢查。

  檢查的邏輯事實上已經被抽象為MessageChecker接口,并為各種類型的消息建立了不同的MessageChecker子類。MessageCheckFactory則這些子類的工廠,負責根據類型創建對應的子類對象。這樣的設計是完全合理的。然而,問題出現在MessageReceiver,它提供了接收消息的方法,通過傳入的消息類型、隊列名稱等參數,返回消息。這個返回值被定義為MessageReader。

  MessageReader正是問題的癥結。我一直強調的面向對象設計中一個重要概念就是所謂”對象的自治“,即對象的職責是自我完備的,它能夠對自己擁有的數據負責,具備了“智能”處理的行為特征。MessageReader違背了這一原則,它是愚笨的對象,仿佛“坐擁寶山而不知”的笨伯,雖然擁有消息的值,卻不知道該如何處理這些消息。簡而言之,它提供的方法只能對XML格式的消息進行讀取,卻不具有真正的業務行為。于是在測試步驟中,就產生了這樣的代碼(省略了部分實現代碼):

private void checkPropagationQueueByName(String name, Queue queue, MessageType messageType) {    MessageReader reader = messageReceiver.getMessageFor(messageType, identifier, queue);    String messageText = reader.toString();    if (messageType == SO05) {        messageCheckFactory.checkerFor(messageType, getExpectedSO05ResponseFor(name), messageText);    }    if (messageType == SO07) {        checkSO07Response(name, messageType, messageText)    }    if (messageType == SO08) {    messageCheckFactory.checkerFor(messageType, getExpectedSO08ResponseFor(name), messageText)        .checkResponse();    }} 

it知識庫重構 — 勿以善小而不為,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 精品一区二区三区高清免费观看 | 暖暖 免费 日本 高清 在线1 | av老司机色爱区综合 | 国产午夜视频在线 | 暖暖 视频 在线 观看 高清 | 97亚洲狠狠色综合久久久久 | 奶头好翘是不是想要了 | 白丝高中生被c爽哭 | 国产精品日韩欧美一区二区三区 | 男女全黄h全肉细节文 | 挤奶门事件完整照片 | 97精品国产自产在线观看永久 | 久久精品亚洲AV高清网站性色 | 国产小伙和50岁熟女23p | 天堂网久久 | 97视频免费观看2区 97视频免费观看 | 欧美高清 videos sexo | 国产一区二区青青精品久久 | 最近中文字幕MV高清在线视频 | 美女扒开腿让男人桶个爽 | 国产 日韩 欧美 综合 激情 | 高清mv视频免费观看 | 国产日韩亚洲精品视频 | 久久综合久久鬼色 | 欧美.亚洲.日韩.天堂 | 麻豆一区二区三区蜜桃免费 | 回复术士勇者免费观看全集 | 耻辱诊察室1一4集动漫在线观看 | 国产 亚洲 另类 欧美 在线 | 纯肉宠文高h一对一 | 日韩精品亚洲专区在线电影不卡 | 伊人影院蕉久 | 精品国产乱码久久久久久乱码 | 亚洲免费在线视频观看 | 国产精品人妻午夜福利 | 玩弄放荡人妻一区二区三区 | 偷窥国产亚洲免费视频 | 在公交车上被JB草坏了被轮J了 | 国产精品久久久久久无码专区 | 亚洲视频无码中字在线 | 欧美性极品黑人hd |