- Extract Method (提炼函数)
public void AddFriendInfo(ulong dbid)
{
FriendData item = CFriendDataClass.instance.CurFriends[dbid];
if (item.onLine == 1)
{
GameObject go = NGUITools.AddChild(uigrid.gameObject, friendItem);
go.name = item.friendDBID.ToString();
FriendsItem friendInfo = go.GetComponent<FriendsItem>();
friendInfo.showLevel.text = "Lv." + item.level.ToString();
friendInfo.showName.text = item.nickName;
ShowItem(friendInfo);
uigrid.repositionNow = true;
}
}
提炼之后
public voidShowFriendsInfo(Dictionary<UInt64, FriendData> show_friends)
{
foreach (var item inshow_friends.Values)
{
if (item.onLine == 1)
{
GameObject go =NGUITools.AddChild(uigrid.gameObject, friendItem);
go.name =item.friendDBID.ToString();
FriendInfoShow(go, item);
}
}
}
public voidFriendInfoShow(GameObject go,FriendData fd)
{
FriendsItem friendInfo =go.GetComponent<FriendsItem>();
friendInfo.showLevel.text ="Lv." + fd.level.ToString();
friendInfo.showName.text = fd.nickName;
friendInfo.di.spriteName ="d2";
friendInfo.uiType =FriendsItem.UIType.RoomInvite;
friendInfo.InfoItemShow(friendInfo.uiType);
uigrid.repositionNow = true;
}
inline Method(内联函数)
这点在自己的代码中没有找到,就是删除简单明了的方法,减少中间层,比如函数返回值是一个bool型,函数体是一句比较的判断。Inline Temp(内联临时变量)
减少临时变量的使用,一般操作将去掉临时变量,两句合在一起。Replace Temp with Query(以查询取代临时变量)
比如临时变量等于两个字段的乘积,可以去除临时变量,提那家一个查询方法,方法体是两个字段乘积,返回值取代原来的临时变量。Introduce Explaining Variable(引入解释型变量)
增加代码可读性Split Temporary Variable(分解临时变量)
一个临时变量不要表达多个用途Remove Assignments toParameters(移除对参数的赋值)
不要对形参赋值,out参数除外Replace Method With MethodObject(以函数对象取代函数)
开发中遇到的情况如下:
public voidShowWorldRankList(Dictionary<int,CRankData> rankDict)
{
Account account = (Account)KBEngineApp.app.player();
ulong selfdbid = account.dbid;
foreach (var item in rankDict)
{
GameObject go = NGUITools.AddChild(uigrid.gameObject, friendItem);
go.name = item.Value.playerDBID.ToString();
FriendsItem friendInfo = go.GetComponent<FriendsItem>();
InfoItemShow(friendInfo);
friendInfo.showLevel.text = "Lv." +item.Value.level.ToString();
friendInfo.showName.text = item.Value.nickname;
friendInfo.showRank.text = item.Value.rank.ToString();
friendInfo.crown.gameObject.SetActive(true);
if (item.Value.playerDBID == selfdbid)
{
friendInfo.di.spriteName ="d1";
friendInfo.showName.text =account.nickname;
friendInfo.addFriend.gameObject.SetActive(false);
friendInfo.Tip.gameObject.SetActive(true);
}
switch (item.Value.rank)
{
case 1:
friendInfo.crown.spriteName= "1";
break;
case 2:
friendInfo.crown.spriteName= "2";
break;
case 3:
friendInfo.crown.spriteName= "3";
break;
default:
friendInfo.crown.gameObject.SetActive(false);
break;
}
uigrid.repositionNow = true;
}
}
将显示排名移到别的类中
public void ItemShowCrown(int rank)
{
switch (rank)
{
case 1:
this.crown.spriteName ="1";
break;
case 2:
this.crown.spriteName ="2";
break;
case 3:
this.crown.spriteName ="3";
break;
default:
this.crown.gameObject.SetActive(false);
break;
}
}
重构之后的代码为:
public voidShowWorldRankList(Dictionary<int,CRankData> rankDict)
{
Account account =(Account)KBEngineApp.app.player();
ulong selfdbid = account.dbid;
foreach (var item in rankDict)
{
GameObject go =NGUITools.AddChild(uigrid.gameObject, friendItem);
go.name =item.Value.playerDBID.ToString();
FriendsItem friendInfo =go.GetComponent<FriendsItem>();
friendInfo.uiType =FriendsItem.UIType.WorldRank;
friendInfo.InfoItemShow(friendInfo.uiType);
friendInfo.showLevel.text = "Lv." +item.Value.level.ToString();
friendInfo.showName.text =item.Value.nickname;
friendInfo.showRank.text =item.Value.rank.ToString();
friendInfo.crown.gameObject.SetActive(true);
if (item.Value.playerDBID == selfdbid)
{
friendInfo.di.spriteName ="d1";
friendInfo.showName.text =account.nickname;
friendInfo.addFriend.gameObject.SetActive(false);
friendInfo.Tip.gameObject.SetActive(true);
}
friendInfo.ItemShowCrown(item.Value.rank);
uigrid.repositionNow = true;
}
}
中间部分还需要继续提出函数,进一步重构
9 替代算法
public void ShowRandomInfo(Dictionary<int,CRankData> rankDict)
{
Account account = (Account)KBEngineApp.app.player();
Dictionary<int, CRankData> randomDict = new Dictionary<int,CRankData>();
Dictionary<int, CRankData> self = (from d inCPlayerRankDataClass.instance.rankDict
where d.Value.playerDBID ==account.dbid
select d).ToDictionary(k => k.Key, v => v.Value);
randomDict =CPlayerRankDataClass.instance.rankDict.Except(self).ToDictionary(k => k.Key,v => v.Value);
if (randomDict.Count < 2)
return;
int[] keys = randomDict.Keys.ToArray();
List<int> keysList = TemplateAPI.Random(keys, 2).ToList();
int num = 0;
if (itemList != null)
{
foreach (var item in itemList)
{
Destroy(item.gameObject);
}
itemList.Clear();
}
foreach (var item in keysList)
{
num++ ;
GameObject go = NGUITools.AddChild(this.gameObject, Item);
go.name = randomDict[item].playerDBID.ToString();
FriendsItem friendInfo = go.GetComponent<FriendsItem>();
friendInfo.showLevel.text = "Lv." + randomDict[item].level.ToString();
friendInfo.showName.text = randomDict[item].nickname;
friendInfo.showRank.text = "";
friendInfo.crown.gameObject.SetActive(false);
InfoItemShow(friendInfo);
switch (num)
{
case 1:
go.transform.localPosition+= new Vector3(18, -205, 0);
break;
case 2:
go.transform.localPosition+= new Vector3(18, -365, 0);
break;
}
itemList.Add(go);
}
}
修改后
public voidShowRandomInfo(Dictionary<int,CRankData> rankDict)
{
Account account =(Account)KBEngineApp.app.player();
List<CRankData> list = newList<CRankData>(rankDict.Values);
int index=-1;
for (int i = 0; i < list.Count; i++)
{
if (list[i].playerDBID ==account.dbid)
{
index = i;
break;
}
}
if(index>=0)
list.RemoveAt(index);
for (int j = 0; j < 2; j++)
{
GameObject go =NGUITools.AddChild(this.gameObject, Item);
FriendsItem friendInfo =go.GetComponent<FriendsItem>();
int objindex=Random.Range(0,list.Count);
CRankData rd = list[objindex];
go.name = rd.playerDBID.ToString();
friendInfo.showLevel.text ="Lv." + rd.level.ToString();
friendInfo.showName.text =rd.nickname;
friendInfo.showRank.text ="";
friendInfo.crown.gameObject.SetActive(false);
InfoItemShow(friendInfo);
list.RemoveAt(objindex);
go.transform.localPosition += newVector3(18, -160 * j - 205, 0);
itemList.Add(go);
}
}