当前位置: 首页 > news >正文

C++类设计的一些心得

      前段时间一直在重构游戏里面的帮战系统,在重构的过程中几次都放到了外网去测试,结果出了很多问题,死锁一次,漏锁一次(导致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等问题。


 

相关文章:

  • (转)Google的Objective-C编码规范
  • oracle 10G rac + asm
  • “绿城百合” 一位Juniper铁杆粉丝
  • PictureBox内的图片拖动功能
  • 如何做域名解析(A记录、CNAME记录、二级域名)
  • 配置错误定义了重复的“system.web.extensions/scripting/scriptResourceHandler” 解决办法...
  • Financial Management
  • Drupal 集成 Question2Answer(用户整合)
  • CCNA CCNP CCIE所有实验名称完整版
  • 【翻译】Ext JS 4.1的性能
  • javascript泛型集合类(转)
  • 华为面试2:1分2分5分的硬币,组成1角,共有多少种组合。
  • HTML5 Canvas 血战消除游戏[连连看]
  • 根据进程启动时间进行kill
  • ORACLE——Instant Client配置SQL*LDR、EXP等命令工具
  • 「面试题」如何实现一个圣杯布局?
  • 【347天】每日项目总结系列085(2018.01.18)
  • eclipse的离线汉化
  • es6--symbol
  • MaxCompute访问TableStore(OTS) 数据
  • node.js
  • python docx文档转html页面
  • python3 使用 asyncio 代替线程
  • ReactNativeweexDeviceOne对比
  • Sequelize 中文文档 v4 - Getting started - 入门
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • Vue 动态创建 component
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 从伪并行的 Python 多线程说起
  • 新手搭建网站的主要流程
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #QT(串口助手-界面)
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (剑指Offer)面试题41:和为s的连续正数序列
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记
  • .NET Core Web APi类库如何内嵌运行?
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .net core 控制台应用程序读取配置文件app.config
  • .net反编译工具
  • .NET精简框架的“无法找到资源程序集”异常释疑
  • .NET轻量级ORM组件Dapper葵花宝典
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [2016.7 day.5] T2
  • [Android]How to use FFmpeg to decode Android f...
  • [ArcPy百科]第三节: Geometry信息中的空间参考解析
  • [AX]AX2012开发新特性-禁止表或者表字段
  • [Bada开发]初步入口函数介绍
  • [C++]Leetcode17电话号码的字母组合
  • [EFI]DELL XPS13 9360电脑 Hackintosh 黑苹果efi引导文件