游戏开发论坛

 找回密码
 立即注册
搜索
楼主: sjinny

我写的网络模块,大家来看看,不用也来讨论讨论……

[复制链接]

4

主题

64

帖子

71

积分

注册会员

Rank: 2

积分
71
发表于 2009-5-20 10:24:00 | 显示全部楼层

Re:我写的网络模块,大家来看看,不用也来讨论讨论……

你的架构我没有看到,我对程序了解一般,就是看到可能也鉴别不了好坏。我只是说我的看法,你的架构是否简单,是否能更简单,是否为了架构而架构?你的架构能否轻易给别人讲明白,逻辑上是否完备,不完备的地方如何处理?

4

主题

64

帖子

71

积分

注册会员

Rank: 2

积分
71
发表于 2009-5-20 10:28:00 | 显示全部楼层

Re:我写的网络模块,大家来看看,不用也来讨论讨论……

对,有本书上有句话很有道理。最重要的是“接口”然后是“框架”最后是“实现”。你现在突出的是实现,而且是不适很完美的实现。所以还需要再修改。
我也测试一下自己的眼光,一般情况下,写出目前你这个代码的工作不超过3年,薪资不过8K。
嘿嘿,当然有的高手没有毕业就很牛了,不排除你是那个高手。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2009-5-20 12:52:00 | 显示全部楼层

Re:我写的网络模块,大家来看看,不用也来讨论讨论……

首先,对于那些实现具体功能、提供具体服务的程序,它们是不需要包含netgate的头文件、链接netgate的库的,对它们的编写者来说,它们只需要知道通过标准输入输出与外界通信,知道通信的协议就可以了。
只有netgate载入的动态链接库(也就是插件)需要包含netgate的头文件。而这些插件本身做的事情应该是尽量简单的,它们只是处理直接和通信有关的事情,负责的事情都在独立的程序里做。
“你看你的文件你的文件内容,有类继承还有头文件依赖,这是不太好的风格。”
这个我不太明白这样会有什么问题,比如这里的Stdio与Channel的确就是is-a的关系。要不然要写成什么样呢?接口继承?那样也就是说Stdio、Connection这些类不会直接从Channel派生,而是聚合进Channel里,但是这样会有什么好处吗?其实这里用不上什么灵活性,因为netgate本身要做的事情很少很明确,“以后添加XXX”的可能非常低。这种情况下我觉得直接继承也是直接有效的方法。
现在其实是把大多数头文件都暴露出去了,这是因为插件本身可能需要对netgate做任何操作。当这些头文件变化时,的确需要重新编译插件。不过由于netgate要做的事情很少很明确,基本上能不在netgate里做的事情我都不在netgate里做,所以当netgate基本稳定后应该不会再有多少变动,除非是从tcp迁移到sctp这种底层通信手段发生了很大的变动的情况,但不过我估计tcp还会使用相当长的一段时间。
总结就是,由于netgate要做的事情很少,插件本身要做的事情也很少,能在外面做的都可以在外面做,所以当netgate的头文件发生变化时,受影响的范围很少,真正实现具体功能的那些程序则并不会受到影响。我觉得当一个程序小到一定程度的时候,用简单直接的方法就可以了,接口继承、imp隐藏之类的带来的灵活性的好处不一定有用武之地,因为这时程序小,所以耦合规模本身就已经很小了。


头文件的名字问题我倒没注意过。如果以后头文件被放入系统的includ目录,可以给netgate建个子目录,这样即使重名也不会有问题了。

我昨天画了图的,但是没法传上来。
只好用文字描述了。

  1. netgate的视角:
  2. TCP (n) <---------> (1) netgate (1) <---------> (m) 具体的应用程序
  3.                       (1)|
  4.                          |
  5.                       (1)|[插件]
  6.                      动态链接库

  7. 具体应用程序的视角:
  8. netgate [stdin] --------->  具体的应用程序  ---------> [stdout] netgate
复制代码

圆括号内是数量关系,方括号内是角色名。

这里有图
http://linux.chinaunix.net/bbs/viewthread.php?tid=1112502&extra=page%3D1

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2009-5-20 13:11:00 | 显示全部楼层

Re:我写的网络模块,大家来看看,不用也来讨论讨论……

呵呵,要是我用了接口继承、用imp隐藏private,然后类名前加上C,成员变量前加上m_,所有public变量都变成private+getter/setter,是不是我在你眼中的估价会上涨?  ;)

4

主题

64

帖子

71

积分

注册会员

Rank: 2

积分
71
发表于 2009-5-20 13:55:00 | 显示全部楼层

Re:我写的网络模块,大家来看看,不用也来讨论讨论……

嘿嘿,个人看法。没有别的什么意思。见谅。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2009-5-20 13:57:00 | 显示全部楼层

Re:我写的网络模块,大家来看看,不用也来讨论讨论……

呵呵
那个图你看了吗?有什么看法

4

主题

64

帖子

71

积分

注册会员

Rank: 2

积分
71
发表于 2009-5-20 14:05:00 | 显示全部楼层

Re:我写的网络模块,大家来看看,不用也来讨论讨论……

我还是那个看法,应该两方面看问题,一个是实现质量;一个是使用者。
实现质量每个人有自己的看法;使用者要简单,你认为netgate不需要改变,他不一定认为,事实上一定会改变的,如果你做过平台项目你应该有了解的。

  人家说“落一叶而知天下秋",大道至简,即使使用C,一样需要和可以做到接口分离,这很重要。至于说的工作年限和薪资,是个人经验看法,你可以说是和不是就好了。

看了一下你的架构图补充一下,我也站在自己的过去看过不少网游项目的网络库所以这么说。 非网游类的网络库,不了解,好像一般网游网络不会这么架构?

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2009-5-20 15:21:00 | 显示全部楼层

Re:我写的网络模块,大家来看看,不用也来讨论讨论……

“事实上一定会改变的”……这个……我不知道为什么会一定改变……
当一个东西简单到一定程度、稳定到一定程度,当它与外界的耦合不过是数据通信、没有什么函数调用,这时种种“接口”技术还能带来多少好处呢?


恩,据我所知,我没见过有任何网络模块是这样做的,一般看到的都是使用者需要使用特定的头文件、库文件,在自己的代码里调用特定的API……我以前做的都是这样,以前做网络模块推翻重来了n次了……
这样的目的就是,简化具体的应用程序的编写,它们只需要这样:

  1. int main()
  2. {
  3.     ...
  4.     while( running ){
  5.         read stdin
  6.         process
  7.         write stdout
  8.     }
  9.     ...
  10. }
复制代码

其实netgate的目标就是充当进程粘合剂,使开发人员可以方便容易地以进程为模块的基本形式、以IPC成为解除耦合的基本手段。

4

主题

64

帖子

71

积分

注册会员

Rank: 2

积分
71
发表于 2009-5-20 15:24:00 | 显示全部楼层

Re:我写的网络模块,大家来看看,不用也来讨论讨论……

汗,明白了你的意思了,更汗了。膜拜。。。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2009-5-20 17:25:00 | 显示全部楼层

Re:我写的网络模块,大家来看看,不用也来讨论讨论……

呃……你的意思是……
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-20 04:36

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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