繁体   English   中英

是什么让这段代码变坏了

[英]What really makes this code bad

在我的公司,我遇到了以下两个代码片段,我发现这些代码片段一见钟情,但本着向撰写该代码的工程师提供建设性反馈的精神,我试图提出技术论据,为什么这段代码是坏:

FileTableEntry * FilerManager::GetFileTableEntry(uint32_t i) const {
  return &(GetFileTable()[i]);
}

…
for (uint32_t i = 0; i < container_.size(); ++i) {
   *GetFileTableEntry(i) = FileTableEntry();
   // GetFileTableEntry ultimately accesses a std::vector in FileManager
}

我的主要论点是:

  1. 这段代码非常间接和误导,它不应该使用getget来初始化(FileManager的一部分),但至少是一个setter:更直接使代码更容易理解。
  2. getter完全泄漏了FileManager的内部状态,因此FileManager的封装在这一点上没有任何意义。 更糟糕的是,getter承诺适用于const对象,但是很快就会用来改变FileManager的内部状态。 打破封装是使重构更难的必由之路。

还有其他论据不写这样的代码我会遗漏吗?

反对此代码的另一个参数是GetFileTableEntry的签名在对象始终存在的情况下返回指针。 这需要引用,而不是指针:

FileTableEntry& FilerManager::GetFileTableEntry(uint32_t i) const {
    return GetFileTable()[i];
}

这应该解决你的第一点。 你的第二点可以通过引用const来解决:

const FileTableEntry& FilerManager::GetFileTableEntry(uint32_t i) const {
    return GetFileTable()[i];
}

这禁止调用者修改GetFileTableEntry返回的内部状态。

注意:要使GetFileTableEntry函数有用,应该添加传入的索引的边界检查以及早捕获错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM