開車的朋友一定要充分了解,駕駛汽車其實是在不斷修正汽車的方向流程。在整個駕駛過程中。你必須緊盯前方目不轉睛。通過不斷地校正方向盤的方向。否則,即使在直的部分可能會偏離車道。那些司機疲勞駕駛,由於睡眠,不再正確方向。車輛將越來越多地偏離航向。在這種情況下,小盹。也能造成車毀人亡的嚴重後果。
重構與駕車儘管屬於全然不同的領域。但其道理是相同的。我們在運用重構方法改動**的過程中也是常常會犯錯的(是人就會犯錯)。
犯錯就如同偏離了航向一樣,因此我們須要不斷去矯正。既然是矯正。就必須有乙個正確的標準。以及推斷是否正確的方法。駕車過程中正確的標準是車輛是否正確行駛在自己的車道上,推斷是否正確的方法則是司機朋友的目測。相同地,重構過程中正確的標準是我們的軟體是否保持重構前的外部行為,推斷的方法則是測試,不論是手工測試還是自己主動化測試。
說起來這個道理非常easy,但問題是你不可能隨時都在測試,隨時都在矯正,這是不可能的。因此,我們必須要有乙個週期,即間隔多長時間測試並矯正一次。週期越長。出大問題的機率就越大,就如同那個睡著了的司機;週期越短,我們所須要付出的成本就越高,由於每進行一次測試都是須要我們付出成本的。週期的長短是須要我們去不斷權衡的。
然而。與駕車不同,重構的測試週期還要取決於完畢一次重構並提交**的週期。由於軟體重構總是這樣乙個過程。首先改動一部分**,使程式處於乙個錯誤而無法編譯執行的狀態,然後全然其他全部相關**的改動,使程式恢復編譯可執行的狀態。在這個中間狀態中。我們是無法測試的。或者說測試是無意義的。僅僅有當相關**都改動完畢,程式恢復到可執行狀態時,測試才變得有意義。
每完畢這樣乙個過程。我們稱之為「完畢一次重構」。而完畢一次重構所花費的時間,是決定我們測試週期的關鍵因素。
既然如此。我們完畢一次重構究竟要花費多少時間呢?這聽起來像是在進行數學推導,但當中的道理就是這樣。
決定一次重構花費的時間,是由我們的設計決定的。小設計,我們對**的改動量少,我們完畢重構的時間就短;大設計,我們對**的改動量大。我們完畢重構的時間必定長。完畢重構時間長,測試的週期就長,我們發現錯誤的時間就晚。可能給我們造成的損失必定就大。
大布局為什麼我們傷不起?漫長的業務整理。漫長的設計與開發,持續數月之久。在這數月中我們一直都無法評估自己是否正確。
當我們辛苦數月之後才被告知我們犯錯了。一切都為時已晚。專案不得不滑入了失敗的深淵。這就是前面那個故事系統改造失敗的根本原因。
我們說,大布局不能夠。但大設計相同不可能。我開始要重構了。我們思考了非常多問題,運用了非常多重構手法。來完畢一次重構。這種重構,**改動量必定多,重構週期必定長,出錯的風險就大。
因此。我們的重構應當是乙個乙個的小設計。
運用乙個重構手法。解決乙個問題,完畢一次重構,測試通過。再運用乙個重構手法,解決還有乙個問題。完畢還有一次重構……如此往復,這就是我在前面所說的「小步快跑」的開發模式。
可是乙個我必需要澄清的概念就是,推斷是否是大設計的衡量標準並非**行數。舉乙個簡單樣例,我們將一段上千行的**從乙個函式,原封不動地挪到還有乙個函式中,而這段**本身修改非常小,這屬不屬於大設計呢?顯然不屬於,由於我們真正修改的**量不多。後面我們將看到。重構過程會常常進行這樣的**的搬移。
小步快跑讓我們每次重構的時候僅僅關注乙個問題,運用乙個重構手法去解決這乙個問題。
這樣就使我們每次在改動問題時不會想得太多太遠。可是。小步快跑並非要我們全然沒有遠期規劃,不是這種。你能夠有遠期規劃,但這種規劃不要做得太早,過早做出這些規劃往往easy顧此失彼。先工作一段時間,做一些基礎的工作。讓我們對系統的總體有了乙個比較全面地認識,然後再規劃。這樣將得到更好的效果。
同一時候,它要求我們對遠期的規劃不要過細。越最近的計畫越細,越遠期的規劃越粗。
一些人之所以急急匆匆地去做仔細的遠期規劃,是由於操心今天做出來的東西,到了今後發現不對。得改。所以今天多想想,多規劃一些。但問題是,今天規劃的就正確嗎?假設是當然非常好。而現實經常是否。不對的規劃卻經常適得其反,讓我們陷入一種困境,一種既不能解決當前問題。又不得不為錯誤設計埋單的困境之中。因此重構的思想卻全然打破了這樣的思維習慣。重構不懼怕改動。由於它讓明天的**改動是安全的,而不再是走鋼絲。
它覺得,今天的任務就是改今天的。即使到了明天會被覺得是錯誤的,也是明天再改去。
大話重構**首頁:
根據身高重建序列
是好想,但思路不好想,如果用c語言的話,那你的指標還得用的熟練 假設有打亂順序的一群人站成乙個佇列。每個人由乙個整數對 h,k 表示,其中h是這個人的身高,k是排在這個人前面且身高大於或等於h的人數。編寫乙個演算法來重建這個佇列。注意 總人數少於1100人。示例輸入 7,0 4,4 7,1 5,0 ...
444 序列重建
題目描述 驗證原始的序列 org 是否可以從序列集 seqs 中唯一地重建。序列 org 是 1 到 n 整數的排列,其中 1 n 104。重建是指在序列集 seqs 中構建最短的公共超序列。即使得所有 seqs 中的序列都是該最短序列的子串行 確定是否只可以從 seqs 重建唯一的序列,且該序列就...
oracle10g dbconsole 重建步驟
oracle10g dbconsole 重建步驟 當安裝oracle的機器變了機器名,或者變了ip位址。那麼原來的dbconsole就起不來了。當在dos下執行 emctl start dbconsole 的時候報錯。解決辦法 搜尋自 同樣適用於windows,unix,linux其他原因導致dbc...