专栏首页王亚昌的专栏合理使用const,慎用自运算

合理使用const,慎用自运算

    项目最的出了几次运营事故,都是因为使用自乘、自加、自減运算,错改了非局部变量,导致将用户数据写溢出,最终只能进行回档处理。先给大家展示一下,漏出bug的代码吧。

代码展示

代码1

 /* 
 * 给每个用户补偿固定值的金币数 
 */  
  
int main(int argc, char ** argv)  
{  
    if (argc < 2)  
    {  
        printf("Usage:%s addmoney", argc[0]);  
        return -1;  
    }  
      
    /* 取出每个用户需要补偿的金币数 */  
    int addmoney = atoi(argv[1]);  
    int id = 0;  
    while (1)  
    {  
        /* 即出用户ID*/  
        id = GetUserId();  
        if (id <= 0)  
        {  
            break;            
        }  
          
        /* 补偿*/  
        addmoney += GetUserMoney(id);  
        SetUserMoney(addmoney);  
    }  
  
    return 0;  
}  

   作者本意是给每个用户补偿固定值的金币数,即如果addmoney为500,那每个用户都加500,但这里因为把addmoney作了自加操作,结果后面的使用成了累加,如果这里合理的使用const并考虑到变量的作用域,就不会出错。修改后代码如下:

[cpp] view plain copy
/* 取出每个用户需要补偿的金币数 */  
constint ADDMONEY = atoi(argv[1]);  
while (1)  
{  
    /* 即出用户ID*/  
    int id = GetUserId();  
    if (id <= 0)  
    {  
        break;            
    }  
      
    /* 补偿*/  
    int currentmoney = GetUserMoney(id);  
    currentmoney += ADDMONEY;  
    SetUserMoney(currentmoney);  
}  
 

代码2

 [cpp] view plain copy
/* 
 * 给用户加上指定的金币数 
 * 金币数=金币基数*倍数, 基数保存在MapAddMoney中,倍数保存在MapMulti中,都使用id的低三位做key 
 */  
int AddMoney(int id)  
{  
    int key = id%1000;  
    int &money = CMoneyConfig::MapAddMoney[key];  
    int &multi = CMoneyConfig::MapMulti[key];  
      
    money *= multi;  
      
    return AddMoney(money);  
}  

问题总结

    其实这里的问题,通过良好的编程习惯是可以得到规避的,我总结了几点:

    1. 使用局部变量,保证变量的最小作用域。

    2. 对于明确不需要修改的变量,无论是传入参数、局部变量或返回值,加上const。

    3. 慎用指针和引用,接口返回指针和引用时,加上const,防止调用者误操作。

    4. 避免直接使用全局变量和类静态变量,类静态变量一定要通用带有const的接口返回,全局变量一样。

    5. 对接口进行白盒测试,跑N轮,保证输出合法性。

    良好的编程习惯和编程风格是项目成功的关键,不要为了高效而写晦涩的代码, 因为对项目而言,可读性和可维护性远比性能重要。最后重申一下本文的主旨“多使用const, 慎用自运算”!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 对数据操作封装的一点心得

    在对数据进行操作时,可能需要读写name,于是我们写了一个接口,这个接口会实时更新缓存

    王亚昌
  • A*算法C实现

    参考 http://www.cppblog.com/christanxw/archive/2006/04/07/5126.html 实现了A*算法,模拟了一下,...

    王亚昌
  • 【Zookeeper】Leader选举机制示例(异步API)

        上一篇文章中介绍了如何用同步API实现Leader选举机制,本文也借用本一个场景,简单介绍异步API的使用。管理异步API的使用,可以方便大家在一些单进...

    王亚昌
  • Leetcode 137 Single Number II

    Given an array of integers, every element appears three times except for one. F...

    triplebee
  • 图像处理卷积算法实现

      今天心血来潮,想把传统的卷积算法实现一份不采用各种加速方式,仅优化算法逻辑的纯净版本。 写完发现性能还可以,特发出来分享之,若有博友在此基础上,进行了再次优...

    cpuimage
  • C++中动态申请数组

    动态申请一维数组 申请使用new,释放使用delete[] 可以通过数组名[下标]和*(数组名+下标)的方式访问数组

    卡尔曼和玻尔兹曼谁曼
  • Java中实现找到两个数组交集的2种方法,开发实用

    1、用HashSet实现的解决方法 实例代码如下: public int[] intersection(int[] nums1, int[] nums2) { ...

    用户1289394
  • c++之函数

    绝命生
  • 回溯法求组合问题

    用户7727433
  • 1061 判断题 (15 分)

    可爱见见

扫码关注云+社区

领取腾讯云代金券