一次典型的重構

2021-05-12 11:34:43 字數 2859 閱讀 1633

背景描述:

近期要去講一次重構,想收集乙個案例,恰好從網上看到了乙個朋友寫的乙個計算算術表示式的

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...