li-heng 2023-03-24 20:09 采纳率: 80.8%
浏览 46
已结题

怎样设计好一个C++程序里面的模块

怎样设计好一个C++程序里面的模块,需要考虑哪些因素,比如:兼容性、可移植等等,
有没有什么好的理论思想、书籍推荐,有哪些可以参考的设计模式,比如:模块的接口可以使用 门面模式来统一入口,其它还有什么呢?

  • 写回答

3条回答 默认 最新

  • 前网易架构师-高司机 游戏服务器领域优质创作者 2023-03-24 21:00
    关注

    关于第一个问题,其实考虑的不仅仅是兼容性,还需要考虑高可用,灾难可恢复等因素
    比如关于性能上:
    在多线程环境里,需要明确提供给上层的方法是否线程安全,如果不是线程安全的,在上层应用使用的时候加锁是否影响当前的性能。
    在要求快速相应的模块里,需要考虑当前的接口是否可以快速相应,那么需要考虑是否使用缓存来快速查询,而不是从数据库或文件的方式来异步加载返回。
    比如关于高可用:
    现在讲究的是系统需要高可用,当其中几台服务器宕机或异常崩溃,需要保障当前业务服务仍然能正常运行,而且不影响业务的继续执行,所以需要在系统设计的时候就要考虑,所以在一般业务进行中会在缓存或者数据库里保存重要的业务运行时的快照(比如业务执行到哪一步,当前都有哪些重要的临时数据放到缓存或者数据库里),一旦发生崩溃宕机,我们需要在拉起重启的时候从当时运行时环境的缓存信息(一般重要数据缓存起来)里恢复当时的运行时环境,重新跑, 如果当前服务没有重启,由其中一个管理服务分配到集群内的其他服务器来托管继续运行,确保崩溃的事故对用户无感知。
    比如最实际的可扩展性和可读性:
    这个建议看看谷歌编码规范,不同语言由不同语言的编码规范,多看看开源代码,对于函数的参数不能过多,一个函数最好不要做太多复杂的逻辑,尽可能的降低和其他模块的耦合性,比如你要实现一个查找一个业务数据,然后做处理,再排序, 最好不要放到一个函数里,否则你的需求后期变更,你的逻辑将越来越复杂,可以将查询,做处理,排序的逻辑分开。
    可移植性:
    这个基本上都是用宏来控制

    
            SOCK_Stream *stream = new SOCK_Stream(new_id, m_net_manager, m_packet_splitter, accept_socket, m_local_addr, remote_addr, m_UserData);
            
            //rc = reactor()->register_handler(stream, MASK_READ | MASK_WRITE);
    #ifdef WIN32
            rc = reactor()->register_handler(stream, MASK_READ | MASK_WRITE);
    #else
            rc = reactor()->register_handler(stream, MASK_READ);
    #endif
            if (0 != rc) {
                LOG(ERROR)("SOCK_Acceptor::handle_input error, register_handler MASK_READ error");
                stream->close_stream();
                delete stream;
                return 0;
            }
    
    
    

    然后在各个不同平台来实现对应的平台相关调用。
    关于第二个问题:
    建议多看看设计模式:比如常见的桥接模式,单例,工厂模式,代理,适配器,观察者模式等。
    推荐看看 大话设计模式 ,或者我的博客,了解更多游戏服务器架构设计

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月1日
  • 已采纳回答 3月24日
  • 创建了问题 3月24日

悬赏问题

  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程