为什么STL的“empty”成员函数不被命名为“isEmpty”?

4

请查看cplusplus.com中的std::vector

其文档显示它有一个empty()成员函数:

empty
Test whether vector is empty (public member function )
http://www.cplusplus.com/reference/vector/vector/empty/
Signature : bool empty() const;

对于我来说,空的意义应该是从容器中删除所有元素。然而,这是一个测试函数,用于检查容器是否为空。

我检查了所有其他容器,它们都以相同的方式使用 empty 函数。

为什么 stl 没有使用 isEmpty() 呢?

2个回答

1

命名风格

为了保持与C++标准库的命名约定一致,我实际上会将您所指的成员函数命名为is_empty()而不是isEmpty()。也就是说,采用蛇形命名法而不是驼峰命名法。我们可以在其他成员函数中看到这种约定,例如push_back()pop_back()


注意,有一个名为clear()的成员函数可以清空容器。也许省略动词(即假设的is_empty中的is),从而需要更少的键入,是为了将查询容器是否为空(即empty())和清空容器(即clear())的名称分开。
否则,如果使用单词“empty”来查询和更新,查询的成员函数名称可能会包含动词,因为两个成员函数都没有参数。因此,重载将不可能。然后,成员函数可能会被称为empty()is_empty(),用于清空容器和查询其是否为空。

[[nodiscard]] 属性

在某些情况下,一个成员函数的名称既对应一个形容词又对应一个动词(例如,具有名称 emptyclearclean 的成员函数),使用 C++17 的 [[nodiscard]] 属性可以非常有用地标记出不当行为。

例如,在 std::vector 中,empty() 是一个执行查询操作并返回值的成员函数,因此可以标记为 [[nodiscard]],这样如果未使用返回值,编译器会发出警告。这个警告表示程序员可能错误地将 empty() 用作清空容器的方法,但实际上它只是查询容器是否为空。

然而,请注意,编译器并不一定会发出警告。


0
STL方法empty()的创建者似乎不知道或决定不遵循有用的命名约定,该约定将布尔变量和函数的名称以动词开头。正如你指出的那样,empty()是一个模棱两可的名称,因为单词“empty”也可以作为动词使用,因此它可能更多地暗示了一个操作而不是一个查询。 is_empty()将通过清楚地指示该方法执行查询来消除这种歧义。不幸的是,现在STL已经按照这个命名约定进行了标准化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接