博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++类设计的一些心得
阅读量:6294 次
发布时间:2019-06-22

本文共 1347 字,大约阅读时间需要 4 分钟。

      前段时间一直在重构游戏里面的帮战系统,在重构的过程中几次都放到了外网去测试,结果出了很多问题,死锁一次,漏锁一次(导致coredump)。也正是在这次重构的过程中发现了如何设计健壮的类。

1:  整个的帮战系统主要是有两个类,一个玩家类LeagueBattler,一个战场类leaguebattlefield,分别记录各自的信息;之前的同事在注入进入战场逻辑、玩家被打死的逻辑等过程中,随意让玩家实例访问战场类,我们看下面的例子。

玩家进入帮战的处理逻辑,玩家在进入战场时,应该将对应帮派的参战人数加一。
int leaguebattler::enter_scene(){    leaguefield *field = NULL;    this->monitor()->find(this->role_id(),field);    if(field == NULL)    {         return -1;     }     field->join_number[this->league_id()] ++;     return 0;}
在玩家被打死的处理状态,玩家被打死时,应该将killer所在的帮派加分。
int leaguebattler::die_process(){       leaguefield *field = NULL;    this->monitor()->find(this->role_id(),field);    if(field == NULL)    {        return -1;    }    field->mark[this->killer.league_id]++;    return 0; }

类似上面例子很多,玩家的进入或者死亡需要更新战场信息的时候,我之前的程序员居然直接去修改帮派战场信息的数据,就是在类似上述的一个函数中造成了宕机。

2:  后来我们对整个设计进行了重构,重构之后第二个例子变成了这个样子。

int leaguebattler::die_process(){       leaguefield *field = NULL;    this->monitor()->find(this->role_id(),field);    if(field == NULL)    {        return -1;    }    field->update_mark_by_league(this->killer->league_id());    return 0; }
int leaguefield::update_mark_by_league(int league_id){    ACE_GUARD_RETURN(RW_MUTEX,mon,this->field_mutex,-1);    this->mark[league_id] ++;    return 0;}

 这样就避开了两个类之间的相互访问对方数据。类设计的一个原则就是对自己资源的绝对控制,不能被随意访问,一方面是容易维护、另一反面就是不会出现coredump的问题。

 不会出现诸如由于漏锁引起的coredump等问题。

转载地址:http://litta.baihongyu.com/

你可能感兴趣的文章
制作RPM包
查看>>
mysql多实例脚本
查看>>
python文件操作举例
查看>>
Outlook 2003命令行参数开关详解
查看>>
mysql中文乱码问题的解决方案
查看>>
Redhat7开机图形或文字界面
查看>>
Linux state 方式 安装nginx 服务
查看>>
LNMP(php-fpm的pool,慢执行日志,定义open_bashdir,php-fpm进程管理
查看>>
Flask rst 文档转换为html格式文件
查看>>
python 安装第三方库pygame
查看>>
Linux下的grep命令详解
查看>>
磁盘系统管理
查看>>
Linux下ftp+ssl实现ftps
查看>>
JavaScript基础
查看>>
Nginx之反向代理与负载均衡实现动静分离实战
查看>>
Object类型转换为long或者Long
查看>>
16位流应用与代码统计器例题
查看>>
linux内核中符号地址的获取
查看>>
内存对齐的问题
查看>>
分析动态代理给Spring事务埋下的坑
查看>>