當前位置:
首頁 > 最新 > 如何做詳細設計之重構

如何做詳細設計之重構

舊文重發,轉自我的博客,本篇文章寫於2015年01月01日

Picture: from Instagram

今天是2015年1月1日,又是一個新的開始。今天我們來討論如何做詳細設計中的重構。作為一名軟體開發工程師,可能大部分都知道重構這個概念,相信也有很多人有看過Martin Flower的重構這本書,了解一些重構技巧。很多人理解的重構,就是代碼結構基本上要重新設計,大部分代碼需要重寫,所以在實際的工作中,看到項目中的代碼總是抱怨,想著什麼時候能有一段時間來重構一次就好了,其實我不認為這是重構,這叫推倒重來。本文主要講的是如何演變式的重構,每一次需求的變動重新審視目前的詳細設計,並修正詳細設計中的不足。從而保證代碼的可持續的發展。我們將分為需求變了和如何收拾爛攤子來討論今天的內容。本篇不涉及一些重構技巧,因為重構技巧非常多,而且不同的業務場景解決方式不盡相同。如果你想了解重構的技巧建議閱讀Martin Flower大師的重構這本書。

需求又變了!

在這一系列中我一直在講只要你在寫代碼就在做詳細設計,像我這樣工作了一兩年的菜鳥也能做詳細設計。可能你會想經驗那麼少,怎麼能夠做出優秀的設計來應對需求的不斷變化呢?當然我不能做到能夠面對需求的變化並且一成不變的設計。我能做到的是在需求變化時,我及時調整我的詳細設計,來適用新的業務。每次產品經理給我們提出一個需求時,我們都會講「怎麼又變了!」「昨天找你確認還是怎麼怎麼樣的!」「郵件上不是說的是這樣的嘛?」,所以對需求的「變」我們已經習以為常,產品需求不變的就是變。面對這種需求的不斷變化,相信即使你是Martin Flower一樣的大師,你也無法做出可以支撐你整個產品周期的詳細設計。

那麼什麼時候需要重新思考我們的詳細設計呢?

以下是我想到的三種場景:

1、業務增加不符合之前提出的假設時。比如我去年遇到的一個場景,當時做一個單詞朗讀評分的功能,當時用到了公司牛b的評測引擎。該評測引擎分為幾種模式,單詞評測,句子評測等。剛開始產品設計時,只需要支持單個單詞的評測,當時完成了第一個版本,就是把引擎返回的數據直接顯示在界面上。在第二個版本時,需要支持片語評測,片語和單詞的評測引擎不同。需要兩次請求評測引擎,顯然之前第一個版本的設計僅支持一次請求的評測。在變成兩次後,就需要對第一次返回的數據進行緩存,和第二次返回的一起顯示到界面。當時就適時的進行一次設計重構增加一個結果緩存類,來統一管理引擎返回的數據。具有初始化、查詢、回滾等功能(當時的需求涉及重讀,異常退出等,遠比只顯示複雜。顯示只是其中之一)。仔細思考以下自己工作的經歷,這種示例比比皆是。

2、業務頻繁修改,程序顯得很被動時。可能我們經常會遇到這種情況,業務頻繁修改,每次都要修改功能類似的很多地方的代碼。這時就需要從詳細設計上考慮當前設計是否合理。在上一篇理解業務的本質的抽象一節我舉的一個例子就是屬於這類情況。

3、業務中的某些概念發生變化。比如我們目前的做的產品中,剛開始沒有考試的概念,只有試卷的概念。後來增加了考試的概念,一次考試指一個學校一個年級多個學科的概念,這時我們就需要重新考慮我們之前的所有關於試卷的詳細設計是否還滿足當前的需求。當然馬上又要增加聯考,考試的概念又發生變化,這也是我們馬上要解決的問題。

當然可能還會有很多場景。其實每次業務的變化,都需要審視一下我們的當前詳細設計是否滿足新的業務變化!以上討論的時在詳細設計階段的何時需要重構,在重構那本書里,代碼的壞味道一章講解了什麼樣的代碼需要重構。

爛攤子怎麼辦??

以上一節其實講的面對新的需求變化時,我們也要以變應變,而不是以不變應萬變。本節討論的是,在你接手了別人的工作時,遇到了爛攤子怎麼辦?當然你也可能接手一位非常優秀的程序員的代碼,那時就可以仔細的研究一下他的設計思想,學習一下了。當然這是運氣非常好的時候。因為每一位程序員都有著自己的思路,大部分程序員都是接手後不理解原作者的思路,總覺得這也不好那也不好。即使抱怨,但是事已經攤到頭上了,還是要解決的,首先需要理解原作者的思路,理解系統中的每個類的意圖,處理的業務是什麼。採用逐步改進的方式,重構現有代碼。

1、在新增需求時或者以前發生變更時,考慮現有設計是否滿足,如果不滿足,改進和新需求相關的設計。可以根據上一節的兩種情況來審視詳細設計。

2、在充分理解了系統業務,並且對現有代碼理解後,經過領導同意後,進行部分代碼重構。

總之,一般情況下,改進現有的代碼經常是長期的,逐步的修改。

詳細設計的進化

一個軟體從無到有,是一個發展過程,從有到優有是一個過程。就像大自然的生物一樣,大自然的生物需要根據環境的變化以及其他因素的影響不斷的進化,以適應新的變化。所以一款好的軟體也是在不斷的進化的。我們的詳細設計也是需要根據需求的進化而不斷的重構才能適應新的需求。

本篇內容是在平常工作中的實踐思考與總結。如有不妥之處,歡迎討論。

關注本公眾號回復「詳細設計」,查看全部系列內容

歡迎分享給你的朋友


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 代碼技藝 的精彩文章:

TAG:代碼技藝 |