c++中两个方法只有一个地方调用了设置类不同属性的函数,如何优化这两个代码:void ZMMapImp::SetSingleSlotStatus(const DTYPE_FEATURE_ID slotId, enum SLOT_STATUS status) { if (slotId == INVALID_SLOTID) { ZINFO << "SetSlotStatus SlotID not valid : " << slotId; return; } auto parkingId = dblib::UnpackParkingId(dblib::UnpackMapId(slotId)); auto virMap = dblib::VmManager::Instance().GetVMap(parkingId); auto localMap = dblib::VmManager::Instance().GetVLocalMap(dblib::UnpackMapId(slotId)); RETURN_IF_NULL(virMap) RETURN_IF_NULL(localMap) virMap->SetSlotStatus(slotId, status); const dblib::VMSlot* vmSlot = virMap->GetSlot(slotId); if (vmSlot != nullptr) { SlotInfo destSlot; ConvertSlotInfo(vmSlot, localMap->GetZlevel(), localMap->GetRampId(), destSlot); m_defaultTask->RtdMgr()->AddVmSlot(destSlot); } } void ZMMapImp::SetSingleSlotAvailable(const DTYPE_FEATURE_ID slotId, SLOT_AVAILABLE_STATUS status) { if (slotId == INVALID_SLOTID) { ZINFO << "SetSlotStatus SlotID not valid : " << slotId; return; } auto parkingId = dblib::UnpackParkingId(dblib::UnpackMapId(slotId)); auto virMap = dblib::VmManager::Instance().GetVMap(parkingId); auto localMap = dblib::VmManager::Instance().GetVLocalMap(dblib::UnpackMapId(slotId)); RETURN_IF_NULL(virMap) RETURN_IF_NULL(localMap) virMap->SetSlotAvailableStatus(slotId, status); const dblib::VMSlot* vmSlot = virMap->GetSlot(slotId); if (vmSlot != nullptr) { SlotInfo destSlot; ConvertSlotInfo(vmSlot, localMap->GetZlevel(), localMap->GetRampId(), destSlot); m_defaultTask->RtdMgr()->AddVmSlot(destSlot); } }
时间: 2024-03-28 20:42:17 浏览: 146
C++代码优化方法解析
可以将这两个方法中的相同部分提取出来,封装成一个私有函数,然后在两个方法中分别调用这个函数即可。具体的实现可以参考下面的示例代码:
```
void ZMMapImp::UpdateSlotStatus(const DTYPE_FEATURE_ID slotId, std::function<void(dblib::VMSlot*)> updateFunc) {
if (slotId == INVALID_SLOTID) {
ZINFO << "UpdateSlotStatus SlotID not valid : " << slotId;
return;
}
auto parkingId = dblib::UnpackParkingId(dblib::UnpackMapId(slotId));
auto virMap = dblib::VmManager::Instance().GetVMap(parkingId);
auto localMap = dblib::VmManager::Instance().GetVLocalMap(dblib::UnpackMapId(slotId));
RETURN_IF_NULL(virMap)
RETURN_IF_NULL(localMap)
auto vmSlot = virMap->GetSlot(slotId);
if (vmSlot != nullptr) {
updateFunc(vmSlot);
SlotInfo destSlot;
ConvertSlotInfo(vmSlot, localMap->GetZlevel(), localMap->GetRampId(), destSlot);
m_defaultTask->RtdMgr()->AddVmSlot(destSlot);
}
}
void ZMMapImp::SetSingleSlotStatus(const DTYPE_FEATURE_ID slotId, enum SLOT_STATUS status) {
UpdateSlotStatus(slotId, [status](dblib::VMSlot* vmSlot) {
vmSlot->SetSlotStatus(status);
});
}
void ZMMapImp::SetSingleSlotAvailable(const DTYPE_FEATURE_ID slotId, SLOT_AVAILABLE_STATUS status) {
UpdateSlotStatus(slotId, [status](dblib::VMSlot* vmSlot) {
vmSlot->SetSlotAvailableStatus(status);
});
}
```
在这个实现中,我定义了一个名为 `UpdateSlotStatus` 的私有函数,用于更新车位的状态或可用状态。这个函数接受两个参数:车位 ID 和一个函数对象 `updateFunc`,用于更新车位状态。函数对象 `updateFunc` 的参数是一个指向 `dblib::VMSlot` 类型的指针,表示要更新的车位。在 `SetSingleSlotStatus` 和 `SetSingleSlotAvailable` 方法中,我分别调用了 `UpdateSlotStatus` 函数,同时传递不同的 `updateFunc` 参数,以实现更新车位状态或可用状态的功能。
阅读全文