重构之函数提取

本文介绍了几种常见的函数重构技术,包括Extract Method(提炼函数),通过内联简单方法提高效率,Inline Temp(内联临时变量)以减少临时变量使用,Replace Temp with Query(以查询取代临时变量)提升代码可读性,Introduce Explaining Variable(引入解释型变量)和Split Temporary Variable(分解临时变量)增强代码理解,以及Remove Assignments to Parameters(移除对参数的赋值)和Replace Method With MethodObject(以函数对象取代函数)来优化函数设计和职责分离。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 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;
    }
  1. inline Method(内联函数)
    这点在自己的代码中没有找到,就是删除简单明了的方法,减少中间层,比如函数返回值是一个bool型,函数体是一句比较的判断。

  2. Inline Temp(内联临时变量)
    减少临时变量的使用,一般操作将去掉临时变量,两句合在一起。

  3. Replace Temp with Query(以查询取代临时变量)
    比如临时变量等于两个字段的乘积,可以去除临时变量,提那家一个查询方法,方法体是两个字段乘积,返回值取代原来的临时变量。

  4. Introduce Explaining Variable(引入解释型变量)
    增加代码可读性

  5. Split Temporary Variable(分解临时变量)
    一个临时变量不要表达多个用途

  6. Remove Assignments toParameters(移除对参数的赋值)
    不要对形参赋值,out参数除外

  7. 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);
        }


    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值