由于博客上没有重构的文章,顺便从项目中摘个重构的例子过来。软件重构时软件开发非常重要的部分。也许大家都会有这样的经验,一开始努力的设计,但是随着代码的编写,发现偏离了原来的方向了。代码变的越来越难维护和隐晦了。我想告诉你这是你没有重构的后果。这里推荐一本书《重构——改善即有代码的设计》这本书应该是开发人员人手一本的,用来查阅的资料。好了步入正题这是我同事开发的一个软件,没做完后来经过几次转手最后到我的手上。一开始,我真不愿意去重构感觉代码太乱了。不过就拿它当学习的教材还是挺好的。 上菜。
原代码
void CEngeryDlg::UpdateBaseDialog()
{
POSITION pos = m_simulateOutParaList.FindIndex(m_simulateOutParaList.m_lIndex);
POSITION pos1 = m_baseTestItemList.FindIndex(m_simulateOutParaList.m_lIndex);
POSITION pos2 = m_gatherDataList.FindIndex (m_simulateOutParaList.m_lIndex);
CString strRealDeviation, strTelemertry, strTelesignal, strResult,str;
if (!pos1) return; //没有测试记录
CBaseTestItem* pBaseTestItem = (CBaseTestItem*)m_baseTestItemList.GetAt(pos1);
CParameter* pParameter = NULL;
if (pos) {
pParameter = (CParameter*)m_simulateOutParaList.GetAt(pos);
}
...//还有好多行,一般情况下,这样的函数多的达到400多行代码。 够吓人吧。
}
这里提出一小部分来重构,因为我没时间把所有重构都搬上来。
//===============================================
//===============================================
CBaseTestItem* CEngeryDlg::GetTestItemList()
{
const POSITION pos = m_baseTestItemList.FindIndex(m_simulateOutParaList.m_lIndex);
if (pos) {
return (CBaseTestItem *)m_baseTestItemList.GetAt(pos); //没有测试记录
}
return NULL;
}
CParameter* CEngeryDlg::GetParameterList()
{
const POSITION pos = m_simulateOutParaList.FindIndex(m_simulateOutParaList.m_lIndex);
if (pos) {
return (CParameter*)m_simulateOutParaList.GetAt(pos);
}
return NULL;
}
void CEngeryDlg::UpdateBaseDialog()
{
CBaseTestItem* pBaseTestItem = GetTestItemList();
CParameter* pParameter = GetParameterList();
...
}
这里用的的重构时提炼函数,就是把一个非常大的函数,分解成小的函数
这里还可以进一步提炼,就是去除零时变量, 即把用到:
CBaseTestItem* pBaseTestItem;
CParameter* pParameter;
的地方直接用用函数GetTestItemList()和GetParameterList()代替,这是取代零时变量的一种方法,叫做以查询取代零时变量。
当然重构时一小步一小步的稳打稳扎的过程,别一下迈了老大步,修改了n多地方。修改一小步,重新编译下,查看下是否有错。
阅读(1098) | 评论(0) | 转发(0) |