重构 — 改善既有的类图设计 条款11:去除对聚合内部的引用
来源:互联网 发布:顾家沙发 知乎 编辑:程序博客网 时间:2024/04/28 03:45
重构 — 改善既有的类图设计 条款11:去除对聚合内部的引用
黄国强 2008-10-07
先看下面的例子代码。
// 负责表示一个聚合类内部的类
class CInner
{
...
};
// 负责表示聚合类
class CAggregate
{
...
public:
CInner& GetInner(void);
private:
CInner m_Inner;
...
};
图1
如图1,外部类 COther 可以看到 CAggregate 和 CInner 。外部可能通过 GetInner(void) 获得 m_Inner 的引用来修改它。那么,CAggregate 的一致性(即内部概念的完整性)可能招到破坏。
我们一定要想办法去除这种可能性,重构后的类图如图2。所有访问 CInner 的操作都通过 CAggregate 来进行。
代码的实现请看下面。
// 负责表示聚合类
class CAggregate
{
...
public:
CInner GetInner(void)const;
void SetInner(const CInner& newVal);
private:
CInner m_Inner;
...
};
以上代码基本满足了图2的要求。用户如果不经过 CAggregate 根本无法修改 m_Inner。
为什么说基本呢?因为这里有点小小问题,即 CInner 如果本身很大的话,会有一个复制开销。这个依然可以通过设计来解决。后续文章将讨论消除这个复制开销的问题。
黄国强 2008-10-07
先看下面的例子代码。
// 负责表示一个聚合类内部的类
class CInner
{
...
};
// 负责表示聚合类
class CAggregate
{
...
public:
CInner& GetInner(void);
private:
CInner m_Inner;
...
};
图1
如图1,外部类 COther 可以看到 CAggregate 和 CInner 。外部可能通过 GetInner(void) 获得 m_Inner 的引用来修改它。那么,CAggregate 的一致性(即内部概念的完整性)可能招到破坏。
我们一定要想办法去除这种可能性,重构后的类图如图2。所有访问 CInner 的操作都通过 CAggregate 来进行。
图2
代码的实现请看下面。
// 负责表示聚合类
class CAggregate
{
...
public:
CInner GetInner(void)const;
void SetInner(const CInner& newVal);
private:
CInner m_Inner;
...
};
以上代码基本满足了图2的要求。用户如果不经过 CAggregate 根本无法修改 m_Inner。
为什么说基本呢?因为这里有点小小问题,即 CInner 如果本身很大的话,会有一个复制开销。这个依然可以通过设计来解决。后续文章将讨论消除这个复制开销的问题。
- 重构 — 改善既有的类图设计 条款11:去除对聚合内部的引用
- 重构 — 改善既有的类图设计 条款12:消除聚合内部的返回参数的复制
- 重构 — 改善既有的类图设计 条款16:每个类只包含两个聚合箭头
- 重构 — 改善既有的类图设计 条款4:消除重复的依赖关系
- 重构 — 改善既有的类图设计 条款6:模块的防火墙
- 重构 — 改善既有的类图设计 条款15:区分基类和接口
- 重构 — 改善既有的类图设计 条款2:流水不争先
- 重构 — 改善既有的类图设计 条款5:给工厂加一个代理
- 重构 — 改善既有的类图设计 条款14:将多个继承类对外部的依赖上移至基类
- 重构 — 改善既有的类图设计 条款3:用 FACADE 类消除依赖关系的交叉
- 重构 — 改善既有的类图设计 条款8:消除继承类和基类中重复的依赖关系
- 重构 — 改善既有的类图设计 条款10:将多个接口的实现类合并成一个
- 重构 — 改善既有的类图设计 条款13:用观察者模式来维护概念的完整性
- 重构 — 改善既有的类图设计 条款1:将双向依赖改变成单向依赖
- 重构 — 改善既有的类图设计 条款7:为每个角色增加一个接口
- 重构 — 改善既有的类图设计 条款9:用Pimpl惯用法隐藏细节
- 重构-改善既有代码的设计
- 重构-改善既有代码的设计
- 突然觉得非常舒服
- 几个不错的蓝色调页面设计
- C#.net 用ODBC远程连接SQL Server2000---成功!
- 常用的验证
- 数据建模
- 重构 — 改善既有的类图设计 条款11:去除对聚合内部的引用
- Ajax 提交和验证
- 分手
- ajax和XMLHTTP原理
- Ajax在.NET中与Server控件的交互C#
- 一个输入框输入日期或时间,并验证输入是否有效
- Dev C++不同于VC的几点
- 移动通信
- 用Javascript评估用户输入密码的强度