我有一个类,它有一个类型为 std::vector
的成员。在某些地方,我需要另一个类中该 vector 的大小。因为成员是私有(private)的,所以我创建了一个 getter 来返回它。在查看代码时,我想到了一个问题:是调用 getter 然后调用 size()
还是创建一个“size getter”更好?强>
这是我的类(class):
class MyClass
{
private:
std::vector< int > m_myVec;
public:
std::vector< int > getMyVec() const { return m_myVec; }
// Shall I create:
// std::size_t getMyVecSize() const { return m_myVec.size(); }
// ... other function
};
在我做的代码的其他部分:
std::size_t sz = myClsObj.getMyVec().size(); // or
if (myClsObj.getMyVec().size() > 5) { /*...*/ }
这样做是个好习惯,还是我应该创建并调用“size getter”?
我需要 vector (在代码的其他部分我称之为 getter)和它的大小;所以选择只保留一个 getter 是没有意义的。
另一个事实是我使用的是 C++11,所以不需要返回一个 const 引用。
基于 C++11:如果我调用 myClsObj.getMyVec().size()
不返回 vector 而是返回它的大小是不是很聪明?
最佳答案
可以引用Tell Don't Ask原则。这里可能有点困惑,因为这两个版本在技术上都在“要求”某些东西。但重点不是使用 getter 来检索类的实现细节然后对其执行一些操作,而是告诉类完成所需的工作,在本例中是检索大小.
这也与Law of Demeter有关.返回整个 vector 的方法在这个链接中以一种很棒的方式可视化,有以下故事:
[...] “that’ll be $1.95.” At this point, naturally, I removed my pants and the guy started screaming at me about police and indecent exposure. Confused, I said, “look, I’m just trying to pay you — I’ll hand you my pants and you go rummaging around in my pockets until you find my wallet, which you’ll take out and go looking through for cash.
“size getter”方法涉及一种更自然的方式,即自己从裤子中取出钱包并付款:-)
它也直接来自OOP中最基本的概念之一。 - Encapsulation .简而言之,它的目的是向外界隐藏(封装)类实现的尽可能多的细节。更少的耦合给你 future 更多的灵 active 。如果这听起来太抽象或模糊,请不要担心。每个程序员(即我遇到的几乎每个程序员,包括我在内)最终都会遇到一个问题,当每个看似简单的更改之后,都必须在代码的遥远部分进行大量修复。将耦合的报复降在你的手指下,让你想起这条规则,并永远记住它;)
最后,通常您不会创建表示包装的 vector 或类似东西的类。 vector 只是一个技术问题。通常这样的类代表一些特定元素的集合,这些元素在您的域逻辑级别上具有名称。所以大多数时候它不是 .getTheSizeOfMyInnerVector
而是 .getRecordCount
或 .getNumberOfStudents
等。此类的客户甚至不需要知道里面有一个std::vector
。没关系,只要该类处理维护某物 集合的任务即可。例如,在这种情况下,上述灵 active 可能意味着您可以切换到不同的容器,而不必担心您类(class)的客户。而且无需翻阅代码中使用此类的数千个地方。
关于c++ - 如何获取 C++ 类成员 vector 的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25143123/