首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ 解耦實戰:以數據為中心的模塊間通信模式

     編輯:關於C語言

耦合痛點

原始代碼中,xiyou_unpack.cpp(網絡層)直接調用 Map::auto_routing(),導致:
① 網絡層依賴地圖層頭文件
② 雙向編譯依賴,單元測試困難
③ 業務邏輯散落在多模塊,難以維護

解耦核心思想:以玩家數據(PC)為中心

原則:模塊間零直接調用,僅通過共享數據結構(全局/單例 PC)隱式通信。
角色分工:
- 輸入層(鼠標/網絡) → 寫入意圖數據
- 邏輯層(地圖幀更新) → 讀取意圖、執行、清除標記

重構前對比

// 原始:Map.cpp 直接持有 Player 指針調用
bool Map::ccTouchBegan(...) {
    Player* pc = (Player*)getChildByTag(...);
    pc->setAutoMovePos(x, y);  // 緊耦合
}
void xiyou_unpack::unpack_MAP_AUTO_ROUTING(...) {
    map.auto_routing();  // 網絡層依賴 Map
}

重構後:數據驅動模式

// 共享數據結構擴展
struct MapUserInfo {
    int map_destination_x, map_destination_y;
    bool isAutoMove = false;  // 新增:意圖標記
} PC.mapUserInfo;

// Map.cpp:輸入處理 → 寫數據
bool Map::ccTouchBegan(CCTouch* pTouch, CCEvent* pEvent) {
    CCPoint pt = pTouch->getLocation();
    PC.mapUserInfo.map_destination_x = pt.x - getPositionX();
    PC.mapUserInfo.map_destination_y = pt.y - getPositionY();
    PC.mapUserInfo.isAutoMove = true;  // 發起意圖
    return true;
}

// Map.cpp:幀更新 → 讀數據、執行、清標記
void Map::mapUpdate(float dt) {
    if (PC.mapUserInfo.isAutoMove) {
        PC.mapUserInfo.isAutoMove = false;  // 消費意圖
        Player* pc = (Player*)getChildByTag(PC.mapUserInfo.ID);
        pc->setAutoMovePos(PC.mapUserInfo.map_destination_x,
                           PC.mapUserInfo.map_destination_y);
    }
}

// xiyou_unpack.cpp:網絡信令 → 僅寫數據,零 Map 依賴
void xiyou_unpack::unpack_MAP_AUTO_ROUTING(char* data, int len) {
    PC.mapUserInfo.map_destination_x = unpack.unpack_GET_H();
    PC.mapUserInfo.map_destination_y = unpack.unpack_GET_H();
    PC.mapUserInfo.isAutoMove = true;  // 發起意圖
}

架構收益

指標重構前重構後
編譯依賴網絡層 → Map.h雙向無依賴
單元測試需構造完整 Map構造 PC 數據即可
新增輸入源修改 Map 類僅寫 PC 數據
邏輯集中度分散Map::mapUpdate 唯一執行點

適用場景與注意點

  • ✅ 遊戲幀循環架構、事件驅動系統、微服務內部模塊
  • ⚠️ 全局數據競態:單線程幀循環安全,多線程需鎖/原子操作
  • ⚠️ 數據結構膨脹:定期清理廢棄字段,避免「上帝對象」
  • ⚠️ 隱式依賴難追蹤:配合代碼規範、註解、架構文檔

「數據為中心」是游戲開發、實時系統解耦的經典模式,將控制流依賴轉化為數據流依賴,實現模塊獨立演化。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved