Eri*_*c Z 2 c++ oop refactoring
虽然我用C++编写了这个例子,但是这个代码重构问题也适用于支持OO的任何语言,例如Java.
基本上我有A级
class A
{
public:
void f1();
void f2();
//..
private:
m_a;
};
void A::f1()
{
assert(m_a);
m_a->h1()->h2()->GetData();
//..
}
void A::f2()
{
assert(m_a);
m_a->h1()->h2()->GetData();
//..
}
Run Code Online (Sandbox Code Playgroud)
你们会创建一个m_f持有指针的新私有数据成员m_a->h1()->h2()吗?我能看到的是它有效地消除了多级函数调用,这确实简化了代码.
但从另一个角度来看,它创建了一个"不必要的"数据成员,可以从另一个现有的数据成员中推断出来m_a,这有点多余?
我刚刚陷入两难境地.到目前为止,我无法说服自己使用一个而不是另一个.
你有哪些人喜欢,有什么理由吗?
这种技术的奇特之处在于缓存:您计算一次两次引用,并将其缓存在对象中.通常,缓存允许您"支付"计算机内存以加快计算速度.
如果分析器告诉您代码在重复调用中花费了大量时间,则m_a->h1()->h2()这可能是合法的优化,前提是返回值h1并且h2永远不会更改.然而,在没有首先进行分析的情况下进行这样的优化几乎总是一个过早优化的坏迹象.
如果性能不是问题,一个好的规则是远离存储可以从存储在对象中的其他成员计算的成员.如果您想提高清晰度,可以引入一个名称很好的方法(成员函数)来计算两个引用的引用而不存储它.只有在对性能至关重要的罕见情况下,存储才有意义.