我有一个具有type成员的类std::vector
。在某些地方,我需要另一个类中该向量的大小。因为该成员是私有成员,所以我创建了一个getter来返回它。在检查代码时,我想到一个问题:先调用吸气剂然后再size()
创建一个“尺寸吸气剂”是否更好?
这是我的课:
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”?
我既需要向量(在代码的其他部分,我称之为吸气剂),也需要它的大小。因此,选择保留其中一个吸气剂是没有意义的。
另一个事实是我正在使用C ++ 11,因此无需返回const引用。
基于C ++ 11:如果我调用,不返回向量而是返回它的大小是否很聪明myClsObj.getMyVec().size()
?
您可以参考“不要问”原则。这里可能有些混乱,因为从技术上讲两个版本都在“索要”某种东西。但是重点不是要使用getter来检索类的实现细节,然后对它执行一些操作,而是要告诉类做所需的工作,在这种情况下,就是获取大小。
这也与Demeter定律有关。在此链接中以令人敬畏的方式形象化了返回整个向量的方法,并包含以下内容:
[...”即为1.95美元。” 此时,自然地,我脱下裤子,那个家伙开始对我大喊警察和不雅暴露的消息。我很困惑,我说:“看,我只是想付给你-我给你我的裤子,你会在我的口袋里翻腾,直到找到我的钱包,然后掏出钱包去找钱。 。
“大小获取器”方法涉及一种更自然的方法,即从裤子中取出钱包并付款:-)
这也是直接的最基本的概念之一来OOP -封装。简而言之,其目的是向外界隐藏(封装)尽可能多的类实现细节。更少的耦合为您将来提供了更大的灵活性。如果这听起来太抽象或模糊,请不要担心。最终,每个程序员(包括我在内的几乎所有我遇到的程序员)都到了一个地步,每一次所谓的简单更改都必须紧跟着在遥远的代码部分进行大量修补。轻描淡写耦合的报复使您想起这个规则,并永远记住它;)
最后,通常您不创建代表包装矢量或类似内容的类。向量仅仅是一种技术。通常,这样的类表示某些特定元素的集合,这些元素在域逻辑级别上具有名称。所以,大部分时间它不是.getTheSizeOfMyInnerVector
,而是.getRecordCount
或.getNumberOfStudents
等这些类的客户甚至不需要知道,有一个std::vector
内部。没关系,只要该类处理其维护某物集合的任务即可。例如,上述灵活性在这种情况下可能意味着,您可以切换到其他容器,而不必担心您的类的客户端。而且无需遍历代码中可能使用该类的数千个地方。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句