重构!(读与做)

@读:
     “任何一个傻瓜都能写出计算机可以理解的代码。惟有写出人类可以理解的代码,才是优秀的程序员!”   
                                                                                                                    ——  《重构改善代码的既有设计》
       初读本书,屡屡感觉书中所列的许多重构目标过于平淡,重构步骤过于琐屑。这些我们平常也都做,习惯大气挥洒的动作,何必以近乎枯燥的过程小步前进?然后,渐渐我才体会,正是这样的小步与缓步前进,不过激,不燥进,再加上完整的测试配套(是的,测试之于重构及其重要),才是“不带来破坏,不引入bug”的最佳保障。我个人其实不敢置信有谁能够乖乖地按步遵循实现本书所列诸多被我(从人的角度)认为平淡而琐屑的重构步骤,我个人认为,本书的最大价值,除了呼吁对软件质量的追求态度,以及对重构“工程性”的认识,最终最重要的价值还在于:建立起我们对于“目前和未来之自动化重构工具”的基本理论和实现技术上的认识与信赖。人类眼中平淡琐屑的步骤,只是自动化重构工具的基础。机器缺乏人类的“大局观”智慧,机器需要的正是切割为一个一个极小的步骤的指令。一板一眼,一次一点点,这正是机器所需要的,也正是机器的专长。

重构的风险:
       重构具有风险。它必须修改运作中的程序,这可能引入一些错误。如果重构方式不恰当,可能毁掉你数天甚至数星期的成功。如果重构时不做好准备,不遵守规则,风险就更大。你挖掘自己的代码,很快发现了一些值得修改的地方,于是你挖得更深,找到的重构机会就越多......于是你的修改也愈多。最后你给自己挖了个大坑,却爬不出去了。为了避免自掘坟墓,重构必须系统化进行。

重构的必要性:
         代码重构是为了使代码具有很好的可读性、可维护性、可扩展性、可重用性。代码在演化过程中,会由于各种不同的原因,不断产生bad smell。如果不及时清理,bad smell会不断积累,代码逐渐腐化,最终导致代码不可用。
        
重构的定义:
       所谓重构就是在在不改变外在行为的前提下,对代码做出修改,以改为进程序的内部结构。重构是一种有纪律的,经过训练的,有条不紊的程序整理方法,可以将整理过程中不小心引入错误的几率降到最低。本质上说,重构就是“在代码写好之后改进他的设计”。

代码腐化产生的原因:
    1.为了赶进度,开发人员牺牲了质量。

2.业务分析不透彻、技术设计不深入。
3.开发人员经验和意识欠缺。
4.对设计方案的评审和代码走查重视不够,或者根本就没有这个环节。
5.没有专人从业务、技术、人员等各方面拉通全盘考虑。
6.前期无法预测后面所有的变化。
7.技术团队对使用的相关技术掌握得不够,无法最优化地使用。
          8.由于软件开发本身的客观规律,代码腐化本身就不可避免。
第一章 重构,第一个案例:



@做:
/**
* 件尺重 hover
*
* @param request
* @return
* @throws Exception
*/
@RequireHardLogIn
@RequestMapping (value = "/product/searchAheavyFeet" , method = { RequestMethod. GET ,RequestMethod. POST })
@ResponseBody
public Object searchAheavyFeet(HttpServletRequest request) throws Exception
{
    ......
    //为了让库存的hover和件尺重的hover与BaseCose管理页面共用一个service,给库存的hover和件尺重的hover添加标识“singleFlag”
    paramMap.put( "singleFlag" , "singleFlag" );
    while (iter.hasNext()){
        String key = (String) iter.next();
        Object value = data.get(key);
        paramMap.put(key, value);
    }
    ......
}


protected String builderBpSql( final String key, final Map<String, Object> paramMap, final Map<String, Object> flexSearchParam){
    ......
    else if ( "productCode" .equals(key)){
        flexSearchParam.put(key, paramMap.get(key));

        //判断是产品管理页面的productCode还是其他hover的productCode。
        if ( "singleFlag" .equals(paramMap.get( "singleFlag" ))){
            return " {p.code} = ?productCode " ;
        } else {
            return " {p.code} LIKE CONCAT( '%', CONCAT( Trim(?productCode) , '%' ) ) " ;
        }
    }
    ......
}


猜你喜欢

转载自blog.csdn.net/moveflower/article/details/80569522
今日推荐