重构 — 改善既有的类图设计 条款14:将多个继承类对外部的依赖上移至基类
2008-12-29 16:46
351 查看
重构 — 改善既有的类图设计 条款14:将多个继承类对外部的依赖上移至基类
黄国强 2008-12-29
首先看图一。
图一
图一中,类2、类3和类4都是从类1继承。它们同时依赖于类5。这张图第一感觉就是不好看,因为有交叉存在。重构也很简单,正如题目所言,将外部的依赖上移至基类就解决了这个问题。如图二所示。
图二
下面用代码来说明这个重构。
class Class5
{
};
class Class1
{
};
class Class2 : public 1
{
...
private:
Class5 * m_pClass5;
public:
void SampleFunc(void)
{
m_pClass5->Func();
}
...
};
这是重构前的代码,重构后变成这个样子。
class Class1
{
protected:
void CallClass5Func(void)
{
m_pClass5->Func();
}
private:
Class5 * m_pClass5;
};
class Class2 : public Class1
{
...
void SampleFunc(void)
{
Class1::CallClass5Func();
}
...
};
这个重构达到的效果是,Class2对Class5的调用都是通过Class1来实现的。好处是Class2与Class5脱钩,未来Class5的变化只有Class1知道,Class2、Class3和Class4对此一无所知的,故不必修改;
黄国强 2008-12-29
首先看图一。
图一
图一中,类2、类3和类4都是从类1继承。它们同时依赖于类5。这张图第一感觉就是不好看,因为有交叉存在。重构也很简单,正如题目所言,将外部的依赖上移至基类就解决了这个问题。如图二所示。
图二
下面用代码来说明这个重构。
class Class5
{
};
class Class1
{
};
class Class2 : public 1
{
...
private:
Class5 * m_pClass5;
public:
void SampleFunc(void)
{
m_pClass5->Func();
}
...
};
这是重构前的代码,重构后变成这个样子。
class Class1
{
protected:
void CallClass5Func(void)
{
m_pClass5->Func();
}
private:
Class5 * m_pClass5;
};
class Class2 : public Class1
{
...
void SampleFunc(void)
{
Class1::CallClass5Func();
}
...
};
这个重构达到的效果是,Class2对Class5的调用都是通过Class1来实现的。好处是Class2与Class5脱钩,未来Class5的变化只有Class1知道,Class2、Class3和Class4对此一无所知的,故不必修改;
相关文章推荐
- 重构 — 改善既有的类图设计 条款8:消除继承类和基类中重复的依赖关系
- 重构 — 改善既有的类图设计 条款15:区分基类和接口
- 重构 — 改善既有的类图设计 条款3:用 FACADE 类消除依赖关系的交叉
- 重构 — 改善既有的类图设计 条款4:消除重复的依赖关系
- 重构 — 改善既有的类图设计 条款1:将双向依赖改变成单向依赖
- 重构 — 改善既有的类图设计 条款11:去除对聚合内部的引用
- 重构 — 改善既有的类图设计 条款10:将多个接口的实现类合并成一个
- 重构 — 改善既有的类图设计 条款16:每个类只包含两个聚合箭头
- 重构 — 改善既有的类图设计 条款5:给工厂加一个代理
- 重构 — 改善既有的类图设计 条款13:用观察者模式来维护概念的完整性
- 重构 — 改善既有的类图设计 条款12:消除聚合内部的返回参数的复制
- 重构 — 改善既有的类图设计 条款9:用Pimpl惯用法隐藏细节
- 重构 — 改善既有的类图设计 条款2:流水不争先
- 重构 — 改善既有的类图设计 条款7:为每个角色增加一个接口
- 重构 — 改善既有的类图设计 条款6:模块的防火墙
- 重构改善既有代码设计--重构手法14:Hide Delegate (隐藏委托关系)
- PHP 杂谈《重构-改善既有代码的设计》之二 对象之间搬移特性
- 《重构-改善既有代码的设计》——读后总结
- 代码的坏味道(1)—重构改善代码的既有设计
- 重构改善既有代码的设计--重构第一个案例