我有一个类有成员的类std::vector.在某些地方,我需要另一个类中该向量的大小.因为该成员是私有的,所以我创建了一个getter来返回它.在查看代码时,我脑海中浮现出一个问题:调用getter是否更好,然后size()创建"size getter"是好还是好?
这是我的班级:
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
};
Run Code Online (Sandbox Code Playgroud)
在代码的其他部分我做:
std::size_t sz = myClsObj.getMyVec().size(); // or
if (myClsObj.getMyVec().size() > 5) { /*...*/ }
Run Code Online (Sandbox Code Playgroud)
这样做是一种好习惯,还是我会创建并称之为"尺寸吸气剂"?
我需要向量(在代码的其他部分我称之为getter)和它的大小; 所以没有必要选择保留其中一个吸气剂.
另一个事实是我使用的是C++ 11,因此不需要返回const引用.
基于C++ 11:如果我调用它是否如此聪明不返回向量但是它的大小myClsObj.getMyVec().size()?
Bar*_*zKP 15
您可以参考Tell Do Not Ask原则.这里可能有点令人困惑,因为这两个版本在技术上都在"询问"某些东西.但重点不是使用getter来检索类的实现细节,然后对其执行一些操作,而是告诉类执行所需的工作,在这种情况下 - 检索大小.
这也与德米特定律有关.返回整个矢量的方法在这个链接中以一种很棒的方式可视化,具有以下故事:
[...]"那将是1.95美元."此时,我自然地脱掉了裤子,那个家伙开始尖叫我警察和不雅曝光.困惑,我说,"看,我只是想付钱给你 - 我会把你的裤子递给你,然后你会在我的口袋里翻找你的钱包直到你找到我的钱包,然后你会把它取出去寻找现金.
"尺寸吸气器"方法涉及一种更自然的方式,让你的钱包自己从裤子和支付:-)
它也直接来自OOP - Encapsulation中最基本的概念之一.简而言之,它的意义在于隐藏(封装)来自外部世界的类实现的详细信息.较少的耦合将在未来为您提供更大的灵活性.如果这听起来太抽象或模糊,请不要担心.每个程序员(即我遇到的几乎每个程序员,包括我)最终都达到了一个目的,当每个所谓的简单改变时,必须在远程代码中进行大量修复.在你的手指下报复耦合让你回想起这条规则,并永远记住它;)
最后,通常您不会创建表示包装向量或类似内容的类.矢量只是一种技术性.通常这样的类表示一些特定元素的集合,这些元素在域逻辑的级别上具有名称.所以,大部分时间它不是.getTheSizeOfMyInnerVector,而是.getRecordCount或.getNumberOfStudents等这些类的客户甚至不需要知道,有一个std::vector内部.只要类处理维护某事物集合的任务,这没关系.例如,在这种情况下,上述灵活性可以表示您可以切换到不同的容器而无需担心您班级的客户.并且没有翻阅可能在您的代码中使用此类的数千个地方.
Fsm*_*smv 10
制作"尺寸吸气剂"并返回值,m_myVec.size()除非您确实需要完全访问矢量.size getter会将更少的代码暴露给外部世界.如果您只是想提供一种获取向量的方法,那么它本质上就不是私有的.
好吧,首先,正如评论者指出的那样,如果你对向量使用getter,那么让它返回一个const引用而不是副本.
回答你的问题:这取决于你想要的数据封装级别.如果向量本身是类的实现细节,并且您不希望类的用户能够更改其内容(或者只能通过类合同中明确定义的操作),那么您不应该有一个getter(a参考)矢量.
| 归档时间: |
|
| 查看次数: |
1243 次 |
| 最近记录: |