首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是什么让这段代码变坏了?

是什么让这段代码变坏了?
EN

Stack Overflow用户
提问于 2015-07-07 22:22:00
回答 1查看 291关注 0票数 3

在我的公司里,我偶然发现了以下两个代码片段,我一见钟情就感到非常不愉快,但本着向编写这段代码的工程师提供建设性反馈的精神,我正在试图找出为什么这段代码不好的技术论据:

代码语言:javascript
复制
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. 这段代码是非常间接和误导的,它不应该使用getter来初始化(FileManager的一部分),而是至少使用一个setter:更直接的代码使代码更容易理解。
  2. getter完全泄漏了FileManager的内部状态,因此对FileManager的封装在这一点上没有任何意义。更糟糕的是,getter承诺适用于const对象,但它被愉快地用于改变FileManager的内部状态。打破封装是使重构更加困难的一条必经之路。

还有其他关于不写这样的代码的理由吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-07 22:31:04

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

代码语言:javascript
复制
FileTableEntry& FilerManager::GetFileTableEntry(uint32_t i) const {
    return GetFileTable()[i];
}

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

代码语言:javascript
复制
const FileTableEntry& FilerManager::GetFileTableEntry(uint32_t i) const {
    return GetFileTable()[i];
}

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

注意:为了使GetFileTableEntry函数有用,应该对传入的索引添加一个边界检查,以便尽早捕获错误。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31280373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档