程序结构问题,哪种结构好??

vc_boy 2001-07-12 09:42:01
现有一个程序,要完成从用户接收数据,分析后发向后台,并从后台接收应答数据,重新组织后返回给用户,用户的数据请求分为多种,此处以请求类型1、2、3代替。另外由于从用户收到的包和要发向后台的包结构不同所以在收发时要重新组织数据包。

方案一:
1、从用户端取数据GetData()
2、分析取到的数据AnalyData() -> 在此函数中根据不同请求类型取不同数据字段
3、组织发向后台的数据包PreparePacket() ->在此函数中根据不同请求组织不同的数据请求包,数据源已从analydata函数中取得
4、向后台发请求并接收数据SRData() -> 根据不同的请求将不同的应答接收到缓冲中
5、组织向用户返回的数据包PackAnsData()->根据不同请求将缓冲中的数据打成相应的应答包,数据源从SRData函数中取得
6、返回数据给用户
---------------------大体结构为---------------------------
main()
{
GetData();
AnalyData(); <-----|---case req1: ...
|---case req2: ...

PreparePacket(); <------|---case req1:...
|---case req2:...

SRData(); <--------|---case req1:...
|---case req2:...

PackAnsData(); <----|---case req1:...
|___case req2:...

ReturnAns(); //返回应答数据

}


方案二:
1、从用户端取得数据GetData()
2、首先从数据包中取得请求号然后根据不同的请求号分别处理,将针对每个请求的全套过程放到一个主调函数中,如:
switch(reqno)
case 1: doReq1();
case 2: doReq2();
....
3、在相应的请求处理函数中做分析数据,组织数据、向后台收发、组织返回包、返回给用户,如在doReq1()中
3.1 GetReqFieldReq1()->针对1号请求取相应的字段
3.2 PreparePacketReq1()->针对1号请求组织包
3.3 SRDataReq1()-> 针对1号请求向后台收发数据
3.4 PackAnsDataReq1()->针对1号请求组织返回包
3.5 返回数据给用户


---------大体结构为--------

main()
{
GetData();
switch(reqno)
{
case req1:
doreq1(); <-----|GerReqfieldreq1();
|PreparePacketreq1();
|SRDataReq1();
|PackAnsDataReq1();
case req2:
doreq2(); <-----|GerReqfieldreq2();
|PreparePacketreq2();
|SRDataReq2();
|PackAnsDataReq2();

case ...:
.....
}
ReturnAns(); //返回应答数据 此处理可以放在这,也可放在每个doReq中
}


方案三:
打算建一个基类,然后根据不同的请求从基类中继承不同的子类,然后所有不同的操作在相应的子类中完成。具体细节还没想好,但感觉上有点像方案二。

不知各位有什么看法和想法,哪种方案更好一点,可以让程序看上去更清晰一点。我觉得第三种可能要好一点,不知各位有何高见?
...全文
158 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
skt985 2002-01-11
  • 打赏
  • 举报
回复
30966关注! :)
threads 2001-07-12
  • 打赏
  • 举报
回复
这种框架的项目我做过。
我觉得问题的关键是中间处理部分跟前台及后台的接口是不是清晰。
如果比较清晰的话,只要根据不同的功能号从请求包中取不同的字段,从应答包中取需要的字段就ok了。
srdata()应该是通用的吧,可以把压包解包都做在这里面吧。
另外,如果吞吐量比较大,需要响应的比较快的话,建议做成多线程的。
vc_boy 2001-07-12
  • 打赏
  • 举报
回复
我也觉得这样谢谢各位了,加分加分
xxxbird 2001-07-12
  • 打赏
  • 举报
回复

既然使用了类,就不应该使用方案二了。在方案三中,可以将接收和发送部分放在基类中。然后根据不同的数据类型派生出相应的子类。

vc_boy 2001-07-12
  • 打赏
  • 举报
回复
我的程序是多用户的,但是这个处理过程被我封装到了一个线程类中,所以相对来说就像是单用户。
xxxbird 2001-07-12
  • 打赏
  • 举报
回复

很多的时候,开始时说项目不大,可后来...

即使项目不大,也难说以后不会增加新的数据类型。就目前而言,三种实现方法的工作量应该差不多。同样的工作量,为什么不用一个扩充性好的结构呢?



ahphone 2001-07-12
  • 打赏
  • 举报
回复
如果项目不大,不用考虑扩展的,就不要考虑3了。
xxxbird 2001-07-12
  • 打赏
  • 举报
回复

方案二与方案三差不多吧,比方案一要好一点,关键是在你以后增加一个新的数据类型后,不用去改动原有的程序。只要增加新的处理函数或类就行了。

这些方案对只有一个用户及一个后台处理程序时有效。如果有多个用户的话,结构就需要调整了。

lvfengxun 2001-07-12
  • 打赏
  • 举报
回复
关键看你有多少种数据,如果多当然是第3种方法最好,如果少还是用1,2吧

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧