现在的位置: 首页 > 综合 > 正文

代码重构之代码的坏味道

2013年03月03日 ⁄ 综合 ⁄ 共 3214字 ⁄ 字号 评论关闭
文章目录

       自己写段有坏味道的代码无所谓,痛苦的是看那些充斥着坏味道的代码。每当看到这样的代码,一股重构的冲动;当重构也很痛苦时,丫的不管了,重写。

你的代码有坏味道吗?闻闻就知道了。

一:Duplicated Code(重复代码)

       如果你在一个以上的地方看到相同的代码,恭喜你,Duplicated Code来了。这些代码很有可能是Control+C和Control+V搞出来的,有人认为这样比写个方法快多了。

       看下面两个方法:

public function changeAction(roleId : int, resArray : Array, actionId : int) : void
{
    if (_roleDictionary[roleId] != null)
    {
        // 给部位id赋值
        var body : int = resArray[0];
        var clothes : int = resArray[1];
        var hair : int = resArray[2];
        var weapon : int = resArray[3];
        if (int(body) < -2 || int(clothes) < -2 || int(hair) < -2 || int(weapon) < -2)
        {
            return;
        }
        var bodyArray : Array = getAction(body,actionId);
        var clothesArray : Array = getAction(clothes,actionId);
        var hairArray : Array =getAction(hair,actionId);
        var weaponArray : Array =getAction(weapon,actionId);
        var myMovieClip : MovieClipStateMachine = _roleDictionary[roleId];
        myMovieClip.changeAction(actionId, [bodyArray, clothesArray, hairArray, weaponArray]);
    }
}

public function changeWeapon(roleId : int, resArray : Array, actionId : int) : void
{
    if (_roleDictionary[roleId] != null)
    {
        // 给部位id赋值
        var body : int = resArray[0];
        var clothes : int = resArray[1];
        var hair : int = resArray[2];
        var weapon : int = resArray[3];
        if (int(body) < -2 || int(clothes) < -2 || int(hair) < -2 || int(weapon) < -2)
        {
            return;
        }
        var bodyArray : Array = getAction(body,actionId);
        var clothesArray : Array = getAction(clothes,actionId);
        var hairArray : Array =getAction(hair,actionId);
        var weaponArray : Array =getAction(weapon,actionId);
        var myMovieClip : MovieClipStateMachine = _roleDictionary[roleId];
        myMovieClip.changeAll([int(body), int(clothes), int(hair), int(weapon)], 
            [bodyArray, clothesArray, hairArray, weaponArray]);
    }
}

          一个很简单的解决方法是采用Extract Mathod方法提炼出重复代码,调用之:

public function changeAction(roleId : int, resArray : Array, actionId : int) : void
{
	if (_roleDictionary[roleId] != null)
	{
		var myMovieClip : MovieClipStateMachine = _roleDictionary[roleId];
		myMovieClip.changeAction(actionId, getRoleResList(actionId,resArray));
	}
}

public function changeWeapon(roleId : int, resArray : Array, actionId : int) : void
{
	if (_roleDictionary[roleId] != null)
	{
		var myMovieClip : MovieClipStateMachine = _roleDictionary[roleId];
		myMovieClip.changeAll([int(resArray[0]), int(resArray[1]), int(resArray[2]), int(resArray[3])],
                     getRoleResList(actionId,resArray));
	}
}

private function getRoleResList(actionId:int,resArray:Array):Array{
	if(resArray==null || resArray.length!=4) return null;
	var body:int=int(resArray[0]);
	var clothes:int=int(resArray[1]);
	var hair:int=int(resArray[2]);
	var weapon:int=int(resArray[3]);
	if(body<-2 || clothes<-2 || weapon<-2 || weapon<-2) return;
	var data:Array=new Array();
	data[0]=getAction(body,actionId);
	data[1]=getAction(clothes,actionId);
	data[2]=getAction(hair,actionId);
	data[3]=getAction(weapon,actionId);
	return data;
}

      

       代码重复有下面几种情况和解决方案:

  • 多个函数中含有相同的代码:Extract Mathod提炼重复代码
  • 多个互为兄弟类中含有相同的方法:先使用Extract Mathod方法, 然后用Pull up Method将提炼的代码放到超类中
  • 多个无关类中含有相同代码:一是放入某个类中,其他类去调用,二是用Extract Class方法提炼出独立类,所有类调用该独立类的接口,等等
  • 多个类中的代码只是相似:用Extract Mathod方法将相似和差异分离,再用Form Template Method获得一个Template Method
  • 多个函数用不同的算法做相同的事情:用Substitute Method选出较好的一个,把其它的干掉啊,你以为后宫呢

二:Long Method(过长函数)

         函数过长,如果加上代码写的不清晰,那就和看天书没什么差别了。你不得不加注释以告知你的意图,如果到了要用注释来告知你的实现手法的话,这个函数真的很有必要分解了。记住,用代码来解释代码。代码只是用来简单说明函数的用途和用法,而不是描述如何实现某个功能。

抱歉!评论已关闭.