【发布时间】:2017-09-19 06:53:49
【问题描述】:
我有一个包含这两个公共方法的类:
void StateManager::setEntityState(const EntityCTCId id, const EntityCTCState state) {
auto it = entities.find(id);
if(it != entities.end())
it->second.state = state;
else
entities.emplace(id, EntityCTC{id, state});
}
EntityCTCState StateManager::getEntityState(const EntityCTCId id) const {
auto it = entities.find(id);
if(it != entities.end())
return it->second.state;
std::stringstream ss;
ss << "Entity CTC [" << id << "] NOT found!";
throw EntityCTCNotFound{ss.str()};
}
其中entities 是std::map<EntityCTCId, EntityCTC>。
我想重构这些方法以隔离常见的find 并通过引用返回找到的EntityCTC,但我不知道如何处理“找不到密钥”的情况:
EntityCTC& findEntity(const EntityCTCId id) {
auto it = entities.find(id);
if(it != entities.end())
return it->second.state;
else
// ???
}
我找到的唯一解决方案是在这个新方法中抛出异常,但这意味着在setEntityState 中使用try-catch 来区分更新和新插入(我读到异常管理不应该用作逻辑分支,但仅用于错误管理)。
您能建议我其他方法吗?
【问题讨论】:
-
在我看来你过度重构了。如果每个函数的目标不同,我认为在两个不同函数中调用同一张地图上的 find() 没有问题。
-
怎么样: bool findEntity(const EntityCTCId id, EntityCTC &state) ?此外,返回引用不是一个好习惯,因为 id 可能会从实体中删除。
-
将
entities.at用于get 和StoryTeller 的建议(或operator[])用于set 有什么问题?为什么EntityCTCNotFound是由std::string而不是EntityCTCId构造的?