自己写段有坏味道的代码无所谓,痛苦的是看那些充斥着坏味道的代码。每当看到这样的代码,一股重构的冲动;当重构也很痛苦时,丫的不管了,重写。
你的代码有坏味道吗?闻闻就知道了。
一: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(过长函数)
函数过长,如果加上代码写的不清晰,那就和看天书没什么差别了。你不得不加注释以告知你的意图,如果到了要用注释来告知你的实现手法的话,这个函数真的很有必要分解了。记住,用代码来解释代码。代码只是用来简单说明函数的用途和用法,而不是描述如何实现某个功能。
代码重构之代码的坏味道
最新推荐文章于 2022-03-21 15:32:34 发布