【问题标题】:Why is STL "empty" member function not called "isEmpty"?为什么STL“空”成员函数不叫“isEmpty”?
【发布时间】:2019-03-13 06:15:06
【问题描述】:
请检查std::vector 和cplusplus.com。
它说它有一个empty() 成员函数:
empty
Test whether vector is empty (public member function )
http://www.cplusplus.com/reference/vector/vector/empty/
Signature : bool empty() const;
对我来说,空的意思应该是从这个容器中删除所有元素。但是,它是一个测试功能,用于检查容器是否为空。
我检查了所有其他容器,并且都以相同的方式使用空容器。
为什么 stl 不使用isEmpty() 代替?
【问题讨论】:
标签:
c++
stl
naming-conventions
naming
【解决方案1】:
表壳风格
为了与 C++ 标准库的命名约定保持一致,我实际上会将您所指的成员函数命名为 is_empty() 而不是 isEmpty()。也就是说,遵循snake case 命名约定而不是camel case 之一。我们可以在其他成员函数中看到这种约定,例如 push_back() 和 pop_back()。
请注意,有一个名为clear() 的成员函数会清空 容器。省略动词(即,假设的is_empty 的 is 并因此需要较少输入的原因可能是 查询 的名称分离 容器是否为空(即empty())和清空 容器(即clear())。
否则,如果使用单词“empty”代替,对于查询和更新,动词可能是用于查询的成员函数名称的一部分,因为两个成员函数都没有参数。因此,重载是不可能的。成员函数可能会被称为 empty() 和 is_empty() 分别用于清空容器和查询容器是否为空。
[[nodiscard]]属性
在这些情况下,成员函数的名称对应于形容词和动词(例如,名称为empty、clear的成员函数或 clean),使用 C++17 的 [[nodiscard]] 属性对于指示不当行为非常有用。
例如,empty() 和std::vector 中的std::vector——执行查询并因此返回值的成员函数——可以标记为[[nodiscard]],这样如果返回值未使用,编译器会发出警告。这个警告表明程序员可能使用了empty(),就好像它确实清空了容器一样,但它实际上是在查询容器是否为空。
但是请注意,编译器不需要发出警告。
【解决方案2】:
empty() STL 方法的创建者似乎不知道或决定不遵循以动词开头的布尔变量和函数名称的有用命名约定。正如您所指出的,empty() 是一个模棱两可的名称,因为“空”这个词也可以用作动词,因此它可以建议一个动作,就像它建议一个查询一样,如果不是更多的话。 is_empty() 会通过清楚地表明该方法执行查询来消除这种歧义。不幸的是,现在 STL 已经被这个命名约定标准化了。