免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2763 | 回复: 11
打印 上一主题 下一主题

[C++] 软件设计遇到的一个与同事产生思想不一致的问题,大家参谋一下 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-04 09:22 |只看该作者 |倒序浏览
进程A 和 进程 B 需要通信, A发送(由class Send 完成), B接收(由class Recv)。发送的数据值有限的,也就是说把一个枚举值发送出去, 我的设计伪代码如下:

进程A:
class Send{
public:
     send_event(eventid);
};

进程B:
class Recv {
public:
      recv_event(eventid);
};

然后定义一个event 头文件 由A 和 B包含进去就可以了,

enum event{
EVENT_1,
EVENT_2,
EVENT_3,
EVENT_4,
EVENT_5,
EVENT_6,
EVENT_7,
EVENT_8,
......
};

但是同事觉得以下方式好:

class Send{
public:
  send_event_1();
  send_event_2();
  send_event_3();
  send_event_4();
  send_event_5();
  send_event_6();
  send_event_7();
  send_event_8();
   .....
};

class Recv{
public:
  recv_event_1();
  recv_event_2();
  recv_event_3();
  recv_event_4();
  recv_event_5();
  recv_event_6();
  recv_event_7();
  recv_event_8();
   .....
};

我这种方式设计的代码太冗余,并且接口总是随着event 变化而变化,没有可扩展性。

大家看看如何

论坛徽章:
0
2 [报告]
发表于 2009-11-04 09:55 |只看该作者
洗望大家发表一下意见,尽管问题简单

论坛徽章:
0
3 [报告]
发表于 2009-11-04 09:56 |只看该作者
你同事的理由呢?

论坛徽章:
0
4 [报告]
发表于 2009-11-04 10:09 |只看该作者
理由比较多,几个重要理由是:减少共享头文件,不需要传递event参数而直接调用函数。至少到目前,我还没看到这样写代码

论坛徽章:
8
CU大牛徽章
日期:2013-04-17 10:59:39CU大牛徽章
日期:2013-04-17 11:01:45CU大牛徽章
日期:2013-04-17 11:02:15CU大牛徽章
日期:2013-04-17 11:02:36CU大牛徽章
日期:2013-04-17 11:02:58技术图书徽章
日期:2013-12-04 10:48:50酉鸡
日期:2014-01-03 10:32:30辰龙
日期:2014-03-06 15:04:07
5 [报告]
发表于 2009-11-04 10:14 |只看该作者
接口设计原则: 完整且最小。

完整就是功能完备,所需的功能都能提供;最小就是接口数目要少,越少重用率就越高,代码冗余也就越小,有错误被测到的可能性就越高。


不过,注意这里有个前提,就是 接口本身要简洁,不要传条件参数进去——如果参数A取true,则做这个;如果参数B取false,则做哪个。
甚至如果滥用条件参数,那么任何功能都可以用一个接口完成: 如果参数A等于printf,则xxx;如果参数B等于scanf,则yyy,这显然就扯淡了。


具体到你的设计上,如果接受/发送不同的消息有不同的逻辑,那么就应该分成不同的接口(但先用同一个接口接受所有消息、然后再dispatch下去应该更合理一些;甚至如果预期以后event种类、数量可能变化的话,搞一个注册/回调机制会更优雅);否则,如果没有功能差别的话,单一接口更好一些。

论坛徽章:
0
6 [报告]
发表于 2009-11-04 10:15 |只看该作者
强烈顶楼上,说得太好了

论坛徽章:
0
7 [报告]
发表于 2009-11-04 10:16 |只看该作者
原帖由 shan_ghost 于 2009-11-4 10:14 发表
接口设计原则: 完整且最小。

完整就是功能完备,所需的功能都能提供;最小就是接口数目要少,越少重用率就越高,代码冗余也就越小,有错误被测到的可能性就越高。


不过,注意这里有个前提,就是 接口本 ...


金玉良言

论坛徽章:
0
8 [报告]
发表于 2009-11-04 10:26 |只看该作者

回复 #5 shan_ghost 的帖子

说的太好了,我完全同意,我的接口就是用来接收事件的,然后再把事件传递给 状态自动机,状态自动机根据不同输入事件做不同事情。这些事件用途都是为同一个状态自动机输入参数。

论坛徽章:
0
9 [报告]
发表于 2009-11-04 10:28 |只看该作者
2强相遇,勇者胜

论坛徽章:
0
10 [报告]
发表于 2009-11-04 10:35 |只看该作者
这里的事件的逻辑都是为一个状态机所用,而不是类似于 event1 是驱动打印机而event2是驱动网卡这样毫无关联的事件。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP