VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2205|回复: 18

结构设计的问题,高手请进

[复制链接]

2

主题

13

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
发表于 2020-3-16 09:00:01 | 显示全部楼层 |阅读模式
简单点说:
有CDevice1  CDevice2  CDevice3三个类,每个都起自己的线程并阻塞方式运行.有CPolling 类,需要定时调用它以取它状态,并可给它命令.
图如下:

==========    =========    ========      ========
| CDevice1 |  | CDevice2|  |CDevice3|    |CPolling|
==========    =========    ========      ========
      ↑           ↑          ↑            ↑
      ↓           ↓          ↓            ↓
=======================================================
|                CWhat ?                                      |
|                                                      |
=======================================================
       ↑                         |
       ↓                         ↓
============               ===============
| CSocketCmd |              | CSaveModule  |
============               ===============

中间一层我强命名个CWhat模块,这个结构怎么设计好呢?
首先要排除用SendMassage(),因为要继承CWnd而且要太多的swtich().这样性能影响太大.
我靠虑过这样:
Interface IDevice1{..} IDevice2{..} IDevice3{..} ...
class CWhat:public IDevice1,public IDevice2, public IDevice3
{
void Dev1();
void Dev2();
void Dev3();
...
}

在CDevice中这么调用:
void CDevice::Regist(IDevice1* pDev1)
{
  _pDev1 = pDev1;
  ...
}
void CDevice::ThreadCallBack()
{
  _pDev1->IDevice1Funtion();
}
//这样实现了Device调用CWhat的过程,再这么定义接口,再这么调用,可实现CWhat调用各个Device的过程.

//注: 各个Device功能各不相同,无法在它们上面抽个基类.

这样原本是个不错的方案,但是,唉,像CDevice这样的类很多,CWhat要继承
太多的接口.
大家有什么好办法? 欢迎大家来讨论.




回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2020-6-15 18:00:01 | 显示全部楼层
CMutex,CSamphore等等都行
回复

使用道具 举报

0

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-6-17 03:15:01 | 显示全部楼层
所有的 CDevice1都继承一个接口 IDevice,这个接口有个共有方法 DoSomething
然后CWhat里维护一个列表 vector<>, array都可以

void CDevice::Regist(IDevice* pDev)
{
    m_vector.push_back(pDev);
}

void CDevice::ThreadCallBack()
{
    for (xxx)
    {
        IDevice* pDevice = vector[i];
        if (pDevice != NULL)
             pDevice->DoSimething();
    }
}
回复

使用道具 举报

0

主题

15

帖子

13.00

积分

新手上路

Rank: 1

积分
13.00
发表于 2020-6-18 12:15:01 | 显示全部楼层
用C++的模板行不行呀?

template< class _DevType >
class CDevice{...

template< class _DevType >
void CDevice::Regist(_DevType* pDev)
{
  _pDev = pDev
  ...
}

哎, 不清楚CDevice是怎么回事, 图里没出现
回复

使用道具 举报

0

主题

7

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-6-19 09:30:01 | 显示全部楼层
加个CDeviceManager类管理所有的Device,CWhat再包含CDeviceManager
回复

使用道具 举报

0

主题

7

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-6-19 12:45:01 | 显示全部楼层
如果不是明显的Is-A关系,建议少用继承,还不如用成员
回复

使用道具 举报

2

主题

13

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
 楼主| 发表于 2020-7-8 15:45:01 | 显示全部楼层
to:sky_hexia
我是图省事没每一个都写,CDevice是指CDevice1 CDevice2 CDevice3每个实现方式均和它一个样子,
void CDevice::Regist(IDevice1* pDev1)
void CDevice::ThreadCallBack()

实际上是:
void CDevice1::Regist(..){...}
void CDevice1::ThreadCallBack(){..}
void CDevice2::Regist(..){...}
...
to:koby806
呵呵,其实简单点说就是:外围有很多不同类型的设备,要和一个中心枢纽模块交互,怎么设计能
使得结构松散,简洁,高效.
呵呵,这是个蛮有挑战性的问题,松散未必简洁,就像每个设备定义一个接口,CWhat继承这些接口,再定义多个设备接口让设备继承(这样实现交互调用)一样.(一个公共接口是行不通的,先是语意不通,再者方法参数也不同).

to:druboy
如果CDeviceMgr是Proxy这种角色的话,那么它将变的非常庞大(可以想像实现10多个类型的各个功能函数..);
如果用成员方式,在与CWhat交互时,还是免不了上面图的情形. :(

其实我这么考虑的目的有两个:
1.当某类设备硬件更新时,我能很容易的把CDeviceX替换掉,而不需修正系统的其他模块(即松散藕合)
2.CWhat这个心脏级的控制核心要在松散的基础上保持简洁,不要复杂.
回复

使用道具 举报

0

主题

70

帖子

42.00

积分

新手上路

Rank: 1

积分
42.00
发表于 2020-7-8 19:30:02 | 显示全部楼层
一会 CDeviceX 一会 IDevice 一会 CWhat 他们之间什么关系啊,看晕了,可否清晰的阐述一下
回复

使用道具 举报

0

主题

5

帖子

6.00

积分

新手上路

Rank: 1

积分
6.00
发表于 2020-7-8 22:45:02 | 显示全部楼层
不明白接口为什么一定要很多,同类型的设备接口本来就应该是大同小异的,不同的一般都只是参数,参数的问题本来也不是问题,用结构参数就可以解决。结构类型本来就可以很灵活,定一个基类,以基类指针做参数传递,使用时再强制转换成需要的结构类型就可以了,担心不安全的还可以在基类定一个虚接口说明该结构类的实际名称,每次强制转换前先根据这个虚接口来判断就行。
回复

使用道具 举报

2

主题

13

帖子

12.00

积分

新手上路

Rank: 1

积分
12.00
 楼主| 发表于 2020-7-9 17:30:01 | 显示全部楼层
to:爱德华德
CDeviceX 就是CDevice1 CDevice2...中的某一个,x嘛,某一个.
IDevice 和 CDevice一样,解释看 to:sky_hexia
其实,这些都不重要,重要的是对于那个图,采用什么结构或模式去构建.
设计目的,上面我说的很直白了.

to:raccoon1982
...是这样:每一个设备类,可以理解成是操作系统的一个驱动程序!! CWhat就是OS,要与driver实现"双向"通信: 即,CWhat要主动调Device, Device在发生中断时也要主动报给CWhat. 这个比喻与当前情形极其相似,就是底层设备与上层OS间的双向交互设计问题.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表