代码替换修复总结

写于2015-01-09 17:27 由qq空间中转过来,格式有点乱

   奋斗了近两个月了,下了决心,定制一个可执行的计划,对一个老游戏的服务端进行.net化, 前段时间处理的一直都挺顺利,使用C#比较速度的重写了GateServer,LoginServer,RoleServer以及GuildServer. 对于GameServer的庞大工程,则使用了c++cli进行逐步的重构,抽象.     
   首先对一些常用的接口函数使用.net重新封装,核心逻辑部分的c++直接替换调用.net接口.    
   后来对各个模块的网络通信部分使用C#编译的XKSocket库进行处理,摒弃原来c++的还得依赖于windows消息 机制的select socket模型.    
   与GameServer进行网络通信的GateServer,LoginServer,RoleServer,GuildServer都处理的相当顺利,而灾难来 了,那就是GameServer和Player Client的通信.    
   之所以说灾难,那是工程量相当的大,7-8w的代码中,绝大多数函数都涉及或者依赖于Player的管理,而基于一定要 跨过一步的决定,我的代码也没有进行备份,自己一个人开发,也没有使用svn,git等版本管理工具.     
   当把原来的socket通信拿掉接上XKSocket后,与Player管理相关的代码导致了不知道到多少错误.     
   原来代码中使用的数组对玩家进行管理,数组里的内容即对应一个Player对象,而我这里使用了hashtable维护玩家列表, Key是XKSocket底层生成的ConnectionID,Value即Player对象.    
   代码中出现 PlayerArray[iPlyIndex]的频率非常高,同样遍历PlayerArray时 PlayerArray[i]的频率也非常高,由于为了方便 的让使用.net进行控制,对Player进行了一个简单的包装,使用了一个.net的PlyItem包装对应的Player[iPlyIndex].     
   犯了一个致命的错误,即对所有代码中的 PlayerArray[iPlyIndex]和PlayerArray[i] 都替换成了 PlyItem->CppPly  这里要说的重点也就是,在对工程量比较大的代码进行替换过程中,不能因为意思是同一对象或类型,对不同的文本 替换为自己重新定义的代码!!!!!!    
 
    如果当时自己替换后,发现这个问题,还有挽救的机会,随着代码不断的修复,修改,这个问题才浮出水面,而此时自己只能为此买 单,将错就错下去了.
    比如说如下简单代码(随便写的)
void SyncPlyName(int iPlyIndex)
{        
    int i=0;      
    for(i=0;i<MaxPlyCount;i++)        
   {            
     PlyArray[i]->send(PlyArray[iPlyIndex]->Name);        
   }
    替换后的代码,即为 
void SyncPlyName(int iPlyIndex)
{
         int i=0;
       PlyItem^ plyItem=(PlyItem^)GameSrvMng::Instance->htPlyItem[i];
       if(plyItem==nullptr || plyItem->CppPly==NULL) return ;
       for(i=0;i<MaxPlyCount;i++)
       {
             plyItem->CppPly->send( plyItem->CppPly->Name);
       }
}
     显然上在的代码是可以正常编译的, 在这几句简单的代码中自然可以看出问题,但是代码量非常大的情况下,这种大量的错误就会被 隐藏起来..那么各种奇怪的问题,也就出来了.
     虽然发现了这种问题,解决起来不难,但是非常麻烦,因为在改回去的时候,就得注意同样的plyItem->CppPly到底应该改成哪一个对象变量了.       过程中还遇到了其它一些问题,修复过程中的错误方法,导出后来解决难度比较大,但是好在量少,已基本解决完成,而上面的错误,还没有 解决完,而每解决一处都得异常的小心.. 
原文地址:https://www.cnblogs.com/dreamzgj/p/4369154.html