读书人

设计中“接口膨胀”有关问题

发布时间: 2012-02-20 21:18:25 作者: rapoo

设计中“接口膨胀”问题
不知道大家在设计中是否有碰到下面这种情况:
我有4个功能和概念上独立的模块,分别是:M1,M2,M31,M32
它们的关系是:M1-->M2(M1聚合M2),M2-->M31,M32(M2聚合M31,M32)
即:M1-->M2-->M3,M4
一个用户可能实例化一个M1,M2实例M2,M2实例M3,M4
多个用户的话会有多条这样的实例过程
我现在的问题是:M3中需要输入一个参数A,那我现在会想到的是M3的参数需要由
M2来输入,那这样M2便需要一个输入参数A,M2的输入又需要由
M1来提供。如果同样我在M4中也需要一个参数B的话,那最终也
会到M1这里来提供接口输入。随着我的模块或聚合层数的增加
那M1这里会需要提供指数级的接口。不知道有没有更好的方法来
解决这样的 问题呢???

[解决办法]
嗯,让所有的参数都从最顶上来确实不太好。可以举两个例子:
(1)有些输入最终来自配置文件,那么就可以封装一个配置对象,没有洁癖的话还可以把配置对象做成全局变量,这样每个模块都可以访问。有洁癖也不要紧,只需要传递一个指向配置对象的引用或指针,就能获得一大堆“配置参数”;
(2)有些参数是来自外界的(如用户输入或网络消息),这种只需要从处理这些外界输入的模块开始保存这些参数就可以了。而且也可以分门别类存成不同的数据对象,需要时传递整个对象的指针。
[解决办法]
给你一个例子。

有时候你可能觉着,这个参数直接调用Getparam()这样容易的传递进来。
因为参数不是固定的,而是实时的,必须从上层传递进来。
那么,
给你一个解决方案。

C/C++ code
class M1{public:    M2* m_pm2;    M2* GetM2()    {        return m_pm2;    }    void Do_something(int param)    {        m_pm2 ->Do_something(param)    }};class M2{public:    M3* m_pm3;    M3* GetM3()    {        return m_pm3;    }    void Do_something(int param)    {        m_pm3 ->Do_something(param);    }};class M3{public:    void Do_something(int param)    {        // do something    }}; 

读书人网 >C++

热点推荐