背景描述:
近期要去講一次重構,想收集乙個案例,恰好從網上看到了乙個朋友寫的乙個計算算術表示式的
c# 程式,原程式是計算含括號的正整數表示式的四則運算值。讀後,發現問題比較多,而且邏輯有錯誤,因此對其進行了重構。
為簡化起間,將程式的功能進行了簡化:
1 計算的算術表示式只含有
+ 、- 、
* 、/ 運算
2 不含有括號
3 表示式的第乙個符號是數字
4 假定表示式是合法的算術表示式且滿足上邊的約束條件
重構後,**的規模與重構前差不多,但是邏輯的正確性、清晰性、易維護性提高了,內在的質量提高了。
使用的重構手法:1
變數的重新命名
舊程式採用拼音的簡寫做變數名,難以猜測含義,重構後採取有意義的英文名字,而不是漢語拼音的簡拼,增加了易讀性。
2 抽取方法
舊程式中只採用了乙個大方法,重構後拆分成了四個方法,易於理解和復用。
3 抽取類
重構後增加了乙個類,將計算的方法封裝在了類中。
4 優化了演算法
舊程式邏輯複雜,計算
*/ 部分和計算
+- 部分的思路還不一致
5 糾正了邏輯錯誤
舊程式隱藏了邏輯錯誤,當輸入的表示式為
3*3/3/3
是錯誤。
6 增加了簡單注釋
舊程式中基本沒有注釋
重構前的**:/*
*created by sharpdevelop.
*user: dylan ren
*date: 2007-8-7
*/using
system;
using
system.collections.generic;
namespace
oldexpress
publicstatic stringcountexpress(string fc));
for(inti = 0; i< fc.length; i++)
string th = "";
for(inti = 0; i< zfh.length; i++)
if(zfh == '/')
}for(inti = 0; i< fc.length; i++)}
string jzfh = "";
intjxls = 0;
string jzsz = fc.split(newchar);
for(inti = 0; i< fc.length; i++)
if(jzfh.length != 0)
else
}
if(jzfh =='-')
else
}
}return jxls.tostring();
}else
}
}}重構後的**
/** created bysharpdevelop.
* user: dylan ren
* date: 2007-8-7
* time: 13:58
*/using system;
using system.collections.generic;
namespace countnoexpress//將
exprsssting
拆分為運算子和參與運算的數字
privatevoid divideintooperatorandnumber()
);for (inti = 0; i < expressstring.length; i++)}//
判斷某字元是否是
+-*/
符號privatebool isoperator(char c)
//當執行了一次運算後,將參與運算的數字替換為結果,刪除運算子
private voidrebulid(int i,string oldstring,string newstring)
);operatorset=operatorset.remove(i,1);
}public stringcountexpress()
if (operatorset=='/')
}} while(expressstring.contains("*") || expressstring.contains("/"));
//計算所有的加減運算
doif (operatorset=='-')
}} while(expressstring.contains("+") || expressstring.contains("-"));
returnexpressstring;}}
class mainclass}}
一次典型的重構
背景描述 近期要去講一次重構,想收集乙個案例,恰好從網上看到了乙個朋友寫的乙個計算算術表示式的 c 程式,原程式是計算含括號的正整數表示式的四則運算值。讀後,發現問題比較多,而且邏輯有錯誤,因此對其進行了重構。為簡化起間,將程式的功能進行了簡化 1 計算的算術表示式只含有 運算 2 不含有括號 3 ...
痛定思痛 一次失敗的重構
最近搞了乙個演算法,尋找k個有序陣列中,順序為n的那一頁資料。最開始的時候,我用假資料填充法處理了一種特殊情況。實現完上線以後,才發現資料填充存在問題。於是趕緊修改。修改完以後,寫了case去驗證。竟然發現修改前後的版本都能完全通過這些case。我大惑不解,拼命想構造出一組讓舊版本fail,而讓新版...
第一次重構
乙個新專案 訂單有八個狀態,已編制,已派發,已接單,已停單,已出庫,已上車,已卸貨,已完結 要求我根據每個狀態的查詢都寫乙個介面,並且返回的訂單資訊要過濾,而不是需要什麼在set到返回物件中。這需要我寫乙個訂單基本資訊的類orderinfo,然後根據訂單流程,不斷繼承與orderinfo或者orde...