十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
你說的應(yīng)該是重構(gòu)的意思。

創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),榆次企業(yè)網(wǎng)站建設(shè),榆次品牌網(wǎng)站建設(shè),網(wǎng)站定制,榆次網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,榆次網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
java重構(gòu):指程序員對(duì)已有程序在盡量不改變接口的前提下,進(jìn)行重新編寫代碼的工作,一般有以下幾方面:1、去除已知bug。2、提高程序運(yùn)行效率。3、增加新的功能。
Java代碼的重構(gòu)模式主要有三種:
重命名方法重構(gòu)模式、引入解釋性變量重構(gòu)模式、以查詢?nèi)〈R時(shí)變量重構(gòu)模式
重命名方法重構(gòu)模式建議執(zhí)行如下的步驟來完成:
1.建立一個(gè)具有新名稱的方法
2.將舊方法的方法體復(fù)制進(jìn)新方法
3.講舊方法的方法體修改為調(diào)用新方法
4.將所有引用舊方法的地方修改為引用新方法
5.刪除舊方法
引入解釋性變量重構(gòu)模式步驟相對(duì)簡單,如下:
1.聲明一個(gè)局部變量,并將其初始化為需要替換的表達(dá)式部分
2.對(duì)于復(fù)雜的表達(dá)式,用新的局部變量代替其中需要替換的部分
3.對(duì)于該表達(dá)式的其他部分,重復(fù)這個(gè)過程
以查詢?nèi)〈R時(shí)變量重構(gòu)模式的步驟如下:
1.找出只賦值了一次的局部變量
2.將該局部變量聲明為final并重新編譯(以確保該變量的確只賦值了一次)
3.復(fù)制賦值語句的等號(hào)右側(cè)的表達(dá)式,并將其修改為一個(gè)新方法的方法體
4.將賦值語句的等號(hào)右側(cè)更改為對(duì)新方法的調(diào)用
5.將所有對(duì)該局部變量的使用替換為對(duì)新方法的調(diào)用
6.刪除賦值語句以及局部變量的聲明
重構(gòu)舉例:(簡化代碼、提升效率)
重構(gòu)前:
if(list != null list.size() 0){
for(int i = 0; i list.size(); i++){
//skip...
}
}
重構(gòu)后
if(list != null){
for(int i = 0, len = list.size(); i len; i++){
//skip...
}
}
重構(gòu)可以說是覆蓋,用覆蓋一詞來講就比較清楚。
在面向?qū)ο蟮囊粋€(gè)特性--繼承中就表現(xiàn)出重構(gòu)的意思。
重構(gòu),就是繼承于父類方法的子類將子類的方法重寫,方法名及參數(shù)完全相同.
重用是繼承了就可以用父類定義的方法和變量,不用再定義一次。
比如說
class B {
public void see(){
System.out.println("this is b");
}
}
public class A extends B{
public void see() {
System.out.println("this is a");
}
public static void main(String[] args) {
B b=new A();
b.see();
}
}
這是重構(gòu)的意思。
class B {
public void see(){
System.out.println("this is b");
}
}
public class A extends B{
public static void main(String[] args) {
B b=new A();
b.see();
}
}
這是重用的意思
首先,重構(gòu)這個(gè)概念,不是JAVA所特有的,而是軟件工程的一個(gè)概念。
主要是指改善現(xiàn)有的程序代碼,使其更方便、簡單的使用,提高可重用性、可維護(hù)性。
在面向?qū)ο驝++\C#\JAVA等語言中,重構(gòu)的概念一般是指對(duì)類進(jìn)行重構(gòu),一般在現(xiàn)有類的某些功能方法不能滿足擴(kuò)展需要,或者修復(fù)BUG時(shí),就需要重構(gòu)
重構(gòu)是一個(gè)可迭代的過程,可以對(duì)一個(gè)功能重復(fù)重構(gòu),直到其滿足軟件的需求、維護(hù)和可擴(kuò)展性
重構(gòu)的方法比較多,一本書也說不完,一些概念性的內(nèi)容見百科
代碼重構(gòu)(英語:Code refactoring)重構(gòu)就是在不改變軟件系統(tǒng)外部行為的前提下,改善它的內(nèi)部結(jié)構(gòu)。
軟件重構(gòu)需要借助工具完成,重構(gòu)工具能夠修改代碼同時(shí)修改所有引用該代碼的地方。在極限編程的方法學(xué)中,重構(gòu)需要單元測試來支持。
java重構(gòu):指程序員對(duì)已有程序在盡量不改變接口的前提下,進(jìn)行重新編寫代碼的工作,一般有以下幾方面:
1、去除已知bug。
2、提高程序運(yùn)行效率。
3、增加新的功能。
重構(gòu)舉例:(簡化代碼、提升效率)
重構(gòu)前:
if(list != null list.size() 0){
for(int i = 0; i list.size(); i++){
//skip...
}
}
重構(gòu)后
if(list != null){
for(int i = 0, len = list.size(); i len; i++){
//skip...
}
}
何時(shí)著手重構(gòu)(Refactoring)
新官上任三把火,開始一個(gè)全新??、腳不停蹄、加班加點(diǎn),一支聲勢(shì)浩大的千軍萬"碼"夾裹著程序員激情和扣擊鍵盤的鳴金奮力前行,勢(shì)如破竹,攻城掠地,直指"黃龍府"。
開發(fā)經(jīng)理是這支浩浩湯湯代碼隊(duì)伍的統(tǒng)帥,他負(fù)責(zé)這支隊(duì)伍的命運(yùn),當(dāng)齊桓公站在山頂上看到管仲訓(xùn)練的隊(duì)伍整齊劃一地前進(jìn)時(shí),他感嘆說"我有這樣一支軍隊(duì)哪里還怕沒有勝利呢?"。但很遺憾,你手中的這支隊(duì)伍原本只是散兵游勇,在前進(jìn)中招兵買馬,不斷壯大,所以隊(duì)伍變形在所難免。當(dāng)開發(fā)經(jīng)理發(fā)覺隊(duì)伍變形時(shí),也許就是克制住攻克前方山頭的誘惑,停下腳步整頓隊(duì)伍的時(shí)候了。
Kent Beck提出了"代碼壞味道"的說法,和我們所提出的"隊(duì)伍變形"是同樣的意思,隊(duì)伍變形的信號(hào)是什么呢?以下列述的代碼癥狀就是"隊(duì)伍變形"的強(qiáng)烈信號(hào):
·代碼中存在重復(fù)的代碼
中國有118 家整車生產(chǎn)企業(yè),數(shù)量幾乎等于美、日、歐所有汽車廠家數(shù)之和,但是全國的年產(chǎn)量卻不及一個(gè)外國大汽車公司的產(chǎn)量。重復(fù)建設(shè)只會(huì)導(dǎo)致效率的低效和資源的浪費(fèi)。
程序代碼更是不能搞重復(fù)建設(shè),如果同一個(gè)類中有相同的代碼塊,請(qǐng)把它提煉成類的一個(gè)獨(dú)立方法,如果不同類中具有相同的代碼,請(qǐng)把它提煉成一個(gè)新類,永遠(yuǎn)不要重復(fù)代碼。
·過大的類和過長的方法
過大的類往往是類抽象不合理的結(jié)果,類抽象不合理將降低了代碼的復(fù)用率。方法是類王國中的諸侯國,諸侯國太大勢(shì)必動(dòng)搖中央集權(quán)。過長的方法由于包含的邏輯過于復(fù)雜,錯(cuò)誤機(jī)率將直線上升,而可讀性則直線下降,類的健壯性很容易被打破。當(dāng)看到一個(gè)過長的方法時(shí),需要想辦法將其劃分為多個(gè)小方法,以便于分而治之。
·牽一毛而需要?jiǎng)尤淼男薷?/p>
當(dāng)你發(fā)現(xiàn)修改一個(gè)小功能,或增加一個(gè)小功能時(shí),就引發(fā)一次代碼地震,也許是你的設(shè)計(jì)抽象度不夠理想,功能代碼太過分散所引起的。
·類之間需要過多的通訊
A類需要調(diào)用B類的過多方法訪問B的內(nèi)部數(shù)據(jù),在關(guān)系上這兩個(gè)類顯得有點(diǎn)狎昵,可能這兩個(gè)類本應(yīng)該在一起,而不應(yīng)該分家。
·過度耦合的信息鏈
"計(jì)算機(jī)是這樣一門科學(xué),它相信可以通過添加一個(gè)中間層解決任何問題",所以往往中間層會(huì)被過多地追加到程序中。如果你在代碼中看到需要獲取一個(gè)信息,需要一個(gè)類的方法調(diào)用另一個(gè)類的方法,層層掛接,就象輸油管一樣節(jié)節(jié)相連。這往往是因?yàn)殂暯訉犹嘣斐傻模枰榭淳头裼锌梢瞥闹虚g層,或是否可以提供更直接的調(diào)用方法。
·各立山頭干革命
如果你發(fā)現(xiàn)有兩個(gè)類或兩個(gè)方法雖然命名不同但卻擁有相似或相同的功能,你會(huì)發(fā)現(xiàn)往往是因?yàn)殚_發(fā)團(tuán)隊(duì)協(xié)調(diào)不夠造成的。筆者曾經(jīng)寫了一個(gè)頗好用的字符串處理類,但因?yàn)闆]有及時(shí)通告團(tuán)隊(duì)其他人員,后來發(fā)現(xiàn)項(xiàng)目中居然有三個(gè)字符串處理類。革命資源是珍貴的,我們不應(yīng)各立山頭干革命。
·不完美的設(shè)計(jì)
在筆者剛完成的一個(gè)比對(duì)報(bào)警項(xiàng)目中,曾安排阿朱開發(fā)報(bào)警模塊,即通過Socket向指定的短信平臺(tái)、語音平臺(tái)及客戶端報(bào)警器插件發(fā)送報(bào)警報(bào)文信息,阿朱出色地完成了這項(xiàng)任務(wù)。后來用戶又提出了實(shí)時(shí)比對(duì)的需求,即要求第三方系統(tǒng)以報(bào)文形式向比對(duì)報(bào)警系統(tǒng)發(fā)送請(qǐng)求,比對(duì)報(bào)警系統(tǒng)接收并響應(yīng)這個(gè)請(qǐng)求。這又需要用到Socket報(bào)文通訊,由于原來的設(shè)計(jì)沒有將報(bào)文通訊模塊獨(dú)立出來,所以無法復(fù)用阿朱開發(fā)的代碼。后來我及時(shí)調(diào)整了這個(gè)設(shè)計(jì),新增了一個(gè)報(bào)文收發(fā)模塊,使系統(tǒng)所有的對(duì)外通訊都復(fù)用這個(gè)模塊,系統(tǒng)的整體設(shè)計(jì)也顯得更加合理。
每個(gè)系統(tǒng)都或多或少存在不完美的設(shè)計(jì),剛開始可能注意不到,到后來才會(huì)慢慢凸顯出來,此時(shí)唯有勇于更改才是最好的出路。
·缺少必要的注釋
雖然許多軟件工程的書籍常提醒程序員需要防止過多注釋,但這個(gè)擔(dān)心好象并沒有什么必要。往往程序員更感興趣的是功能實(shí)現(xiàn)而非代碼注釋,因?yàn)榍罢吒軒沓删透校源a注釋往往不是過多而是過少,過于簡單。人的記憶曲線下降的坡度是陡得嚇人的,當(dāng)過了一段時(shí)間后再回頭補(bǔ)注釋時(shí),很容易發(fā)生"提筆忘字,愈言且止"的情形。
曾在網(wǎng)上看到過微軟的代碼注釋,其詳盡程度讓人嘆為觀止,也從中體悟到了微軟成功的一個(gè)經(jīng)驗(yàn)。