[英]C++ Private Functions: Whether to pass class member variable by function parameter, or not
这是C ++类实现中一次又一次出现的问题。 我很好奇人们的想法在这里。 您更喜欢哪种代码?为什么?
class A
{
public:
/* Constructors, Destructors, Public interface functions, etc. */
void publicCall(void);
private:
void f(void);
CMyClass m_Member1;
};
同
void A::publicCall(void)
{
f();
}
void A::f(void)
{
// do some stuff populating m_Member1
}
或替代方案:
class A
{
public:
/* Constructors, Destructors, Public interface functions, etc. */
void publicCall(void);
private:
void f(CMyClass &x);
CMyClass m_Member1;
};
同
void A::publicCall(void)
{
f(m_Member1);
}
void A::f(CMyClass &x)
{
// do some stuff to populate x,
// locally masking the fact that it's really m_Member1
}
我想我总是更喜欢第二个,因为然后f
可以在CMyClass
任何实例上运行,但是,说,我有很多代码,其中第一个完全有效,因为f
只会在m_Member1
上m_Member1
而我真的打破了它分为两个函数,使代码更具可读性。
是的,这更像是一个讨论问题,而不是一个“答案”问题,但我对这个推理更感兴趣。 我会将答案标记为答案,提供良好的推理或良好的标准。
另外,请记住,这只是一个玩具示例。 在现实中,这个班级将比这更大,因此组织很重要。
既然你要求意见,如果一个独立的f(CMyClass&)
函数有意义且可实现,那么我也赞成这个选项。 我会选择第一种情况,如果f
执行的操作仅在A类的上下文中有意义,如果CMyClass
仅在A的上下文中有意义,或者它依赖于A
其他属性。 我认为必须根据问题做出决定。
一如既往,这取决于。 每种情况都不同。
在你给出的具体例子中 - 首先我排除了你的选择( void A::f(CMyClass &x)
),主要是因为它“闻起来”不好(正如Martin Fowler所说)。 它是一个私有函数,除非您现在需要将其用于其他实例,否则请使用该成员。 如果需要,您可以随时重构它。
想象一下如果f
有2个参数会发生什么。 3个参数。 10.每次发送它们是否有意义? 拥有这些参数成员不是更好吗?
如果f
必须将其中一些参数发送给A
其他方法怎么办? 使用成员为此更有意义吗?
所有这一切都假设f
确实需要A
持有的其他信息,否则我将其移动为CMyClass
的方法。
问问自己:用m_Member1
以外的对象调用f()
,它现在有什么意义,或者在可预见的将来是否有任何意义?
如果答案是:
f()
为m_Member1
是A
的固有部分。 f(CMyClass &)
。 即使现在你只使用m_Member1
,这也不是你处理的类的内在属性。 f()
。 总有一种选择可以改变你的想法(实际上,如果变化相当微不足道)。 另请注意,函数f()
可以调用另一个函数g(CMyClass &)
,但不能相反。 因此,根据f()
作用,这可能会限制您的选择。
第二个例子中的f
不是A
或全局函数的静态函数,或者是CMyClass
的成员函数吗?
当然,有些情况下,每次调用该函数时最好发送参数,但是当你已经拥有A对象中的CMyClass对象时,为什么还要重新发送它。 如果您需要两个CMyClass对象进行交互,最好将其添加到CMyClass
成员函数列表中,而不是添加到A
。
此外,正如清洁代码所述,你最好使用没有任何参数的函数,而不是带有参数的函数。 当另一个程序员试图读取该函数时,除了函数名之外,它必须解密/注意第二个参数。
我的答案将基于背景。 如果现在或某天可能有多个成员变量实例可能会运行,那么请确保将它们作为参数传递给它们。 但是,如果f对A实例的状态的特定元素进行操作,我不会传递任何内容。 在很多情况下,A中总会只有一个foo。在这一点上,使foo成为f的参数变得愚蠢。 并且效率稍差,除非f是内联的,因为不仅是这个指针被传递,而且还有foo的地址,这是一个额外的副本到堆栈上。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.