Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1062457
  • 博文数量: 264
  • 博客积分: 6005
  • 博客等级: 大校
  • 技术积分: 2798
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-08 20:15
文章分类

全部博文(264)

文章存档

2011年(42)

2010年(213)

2009年(4)

2008年(2)

2007年(3)

分类:

2010-04-11 20:12:18

由于博客上没有重构的文章,顺便从项目中摘个重构的例子过来。软件重构时软件开发非常重要的部分。也许大家都会有这样的经验,一开始努力的设计,但是随着代码的编写,发现偏离了原来的方向了。代码变的越来越难维护和隐晦了。我想告诉你这是你没有重构的后果。这里推荐一本书《重构——改善即有代码的设计》这本书应该是开发人员人手一本的,用来查阅的资料。好了步入正题这是我同事开发的一个软件,没做完后来经过几次转手最后到我的手上。一开始,我真不愿意去重构感觉代码太乱了。不过就拿它当学习的教材还是挺好的。 上菜。
原代码
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) |
0

上一篇:C/C++常见错误

下一篇:重构

给主人留下些什么吧!~~