大话重构7:重构是一系列的等量变换
毫無疑問,系統重構是一件如履薄冰、如坐針氈、你必須時時小心應對的工作,你就像走在鋼絲上的人,每一步你都必需要保證正確,一個不經意的失誤就可能讓你萬劫不復。
雖然如此,僅僅要你掌握了正確的方法。即使站在鋼絲上也能如履平地,而這個正確的方法。就是那些被證明是正確的重構方法。
說了那么多。你一定開始好奇,系統重構究竟都是一些什么方法呢?行了,我也就不賣關子了,我們來看看重構方法工具箱里都有些什么東東。
系統重構要求我們對代碼的每一步改動。都不能改變軟件的外部行為,因此在系統重構中的全部方法。都是一種代碼的等量變換。重構的過程,就好像在做數學題,一步一步地進行算式的等量變換。經過一系列等量變換,終于的結果盡管在形式上與原式不一樣。但通過計算能夠得到與原式全然同樣的結果。
這樣的等量變換對于重構來說很重要,它使得我們進行重構以后,程序還是那些程序,代碼還是那些代碼。可是,等量變換不等于原地踏步。正如矩陣通過等量變換能夠得到方程組的解。微積分能夠通過等量變換計算終于的結果,重構通過等量變換,在保證代碼正確的同一時候,能夠使程序結構得到優化。
為了說明系統重構中的這樣的等量變換。我們來看看一個簡單的樣例。原始程序是這樣的:
?
public class HelloWorld {public String sayHello(Date now, String user){Calendar c;int h;String s = null;c = Calendar.getInstance();c.setTime(now);h = c.get(Calendar.HOUR_OF_DAY);if(h>=6 && h<12){s = "Good morning!";}else if(h>=12 && h<19){s = "Good afternoon!";}else{s = "Good night!";}s = "Hi, "+user+". "+s;return s;} }這是一個很easy的HelloWorld程序。寫得簡單是為了大家更easy看懂程序的變換過程。
這個程序盡管簡單卻符合遺留系統的很多特點:沒有凝視、順序編程、沒有層次、聚合度低。等等。因此我們進行了初步重構,添加凝視、調整順序、重命名變量、進行分段:
?
/*** The Refactoring's hello-world program* @author fangang*/ public class HelloWorld {/*** Say hello to everyone* @param now* @param user* @return the words what to say*/public String sayHello(Date now, String user){//Get current hour of dayCalendar calendar = Calendar.getInstance();calendar.setTime(now);int hour = calendar.get(Calendar.HOUR_OF_DAY);//Get the right words to say helloString words = null;if(hour>=6 && hour<12){words = "Good morning!";}else if(hour>=12 && hour<19){words = "Good afternoon!";}else{words = "Good night!";}words = "Hi, "+user+". "+words;return words;} }然后將兩段凝視中的代碼分別提取出來形成getHour()與getSecondGreeting()函數:
?
/*** The Refactoring's hello-world program* @author fangang*/ public class HelloWorld {/*** Say hello to everyone* @param now* @param user* @return the words what to say*/public String sayHello(Date now, String user){int hour = getHour(now);return "Hi, "+user+". "+getSecondGreeting(hour);}/*** Get current hour of day.* @param now* @return current hour of day*/private int getHour(Date now){Calendar calendar = Calendar.getInstance();calendar.setTime(now);return calendar.get(Calendar.HOUR_OF_DAY);}/*** Get the second greeting.* @param hour* @return the second greeting*/private String getSecondGreeting(int hour){if(hour>=6 && hour<12){return "Good morning!";}else if(hour>=12 && hour<19){return "Good afternoon!";}else{return "Good night!";}} }通過這個樣例我們能夠看到。將沒有先后順序的語句調整編寫順序是一種等量變換,將語句中某段相對獨立的語句提取出來形成一個函數,而讓原語句調用這個函數,也是一種等量變換。除此之外,調整函數名稱、改動變量名稱等等。都是等量變換。
等量變換,程序還是那些程序,運行的結果還是那些結果,但程序組織結構發生了變化。變得更加可讀、可維護、易變更了,這就是重構的意義。
將密密麻麻的程序代碼依照功能劃分在數個函數中,能夠有效地提高代碼的可讀性。將程序中各種各樣的變量和函數合理地予以命名,并在函數頭或定義處適時地進行凝視,也是在提高代碼可讀性;將各種各樣品種繁多的函數恰當地分配到各自的對象中合理地組織起來,則是在有效提高系統的可維護性與易變更性。這些對于一個遺留系統的日常維護與生命延續都是很有幫助的。
大話重構連載首頁:http://blog.csdn.net/mooodo/article/details/32083021
特別說明:希望網友們在轉載本文時,應當注明作者或出處,以示對作者的尊重。謝謝。
總結
以上是生活随笔為你收集整理的大话重构7:重构是一系列的等量变换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到和面发面是什么意思
- 下一篇: js 事件学习与总结