企鹅's Blog

Happy coding

一个网络编程库引发的讨论

企鹅 posted @ 2009年7月03日 07:32 in 未分类 , 1847 阅读

以为网友在 CU 上发了自己的代码,

http://bbs2.chinaunix.net/viewthread.php?tid=1492378&extra=&page=1

网友 6.16 的评价:

 

好了,你想知道事实,那下面我来告诉你什么是事实:

1. 你的项目,测试模块在那里,example又在那里?

成熟的项目,没有那个没有测试模块和example模块的。无论是Unit Test,还是Acceptance Test、Performance Test、Stabe Test还是其他。
测试模块式质量的保证,敢问你的测试模块又在那里?
Example模块式告诉别人,每个常用的功能是怎么使用的,但请问,你的example模块又在那里?难道一个log server就完了?

写了四年的库,居然没有与之配套的Test和example,说你不成熟,我想光这一点也就足够了吧?

好了,在来看看其他的方面。

2. think_os.h 里,60到65行,居然屏蔽了4个windows版的wraning,虽然Boost里面有模块这样做,但本人作为一个Windows的开发者而言,你连 Windows的警告都高不定,还需要靠屏蔽来粉饰。高不定的人会旭辉认为没有什么大不了的,但在我看来,的确还有待提高。换用flw的话说,就是 “次”。

3. 你在很多头文件里Hard code了一堆ULL的值,也就是unsigned long long,你是怎么确定这个的长度的?
32 bits的系统? 64-bits的系统?
如果是64-bits,请问是哪种数据模型?LLP64?ILP64?还是其他?

4. 不少地方,嵌套得太恐怖,比如 think_utility.c 的  think_getopt 函数。在第528行到631行。自己去看。

5. 某些函数太长,是否需要重构一下?
think_db.c, think_db_open 函数,86到313行。
think_cfg.c,__think_loadcfg函数,24到197行。

6. Log? Log就这么简单?
为什么用你的Log而不用Logcxx的呢?你的Log的可定制程度又有多少呢?你的Log能否自动回滚、自动根据时间分别保存、自动级别分类呢?
如果能,你的手册在那里?

7. 网络?
网络就这么简单?哦,我看到了有poll,有select。但是,这也叫“很高”?你到底测过没有?并发量,压力数?
哦,IOCP, epoll,kqueue呢?
难道你给用户写复杂通讯程序的库,一个初级的select/poll就搞定了?你知不知道select的上限和瓶颈?

8. 代码不想看下去了。风格还算可以。但功能太简单。
首先,你的那些功能,那些函数是多线程安全的,那些是多线程不安全的?
那些是可重如的?那些是不可重入的?
每个调用的输入输出有什么意义和限制,边界条件时又会怎样?返回值又代表什么意义?
请问,你的手册上面写了么?
难道你让用户去看你的代码?
搞笑!!

9. 配置:

QUOTE:
原帖由 enigma1983 于 2009-6-24 22:37 发表
1。配制文件:
          不管什么程序总要读取配制文件吧?
          我的配制文件特别之处在于:支持继承、别名、覆盖、include、行内注释

实在想象不出,这真有什么特别的么?
还是说,你见过的太少了?


10. 通讯协议

QUOTE:
原帖由 enigma1983 于 2009-6-24 22:37 发表
5。通讯语言:
          写通讯类程序总要用到语言吧(也可称为协议)
          如果用XML语言来定义协议,解析效率会很差,协议定义复杂了,别人也很难解析
          8583类协议吧,又不支持字段乱序存放,1、2、3、4等位元必须依次存放,而且做字段嵌套也麻烦
          本人定义的GL语言,简单到极致,就是域号、域长度、域内容,很好解析,也很好嵌套,也可以乱序存放,增加字段,删除字段都很容易

XML是工业标准,为什么不用。不用你又怎么和其他的兼容?
私有协议?私有协议不是不行,但为什么又要用你这个而不是根据项目实际需求定义?
而且,你只说了文本协议,你真的知道文本协议和二进制协议各自的优缺点和适用场合么?

11. TCP封装

QUOTE:
原帖由 enigma1983 于 2009-6-24 22:37 发表
6。TCP库封装:
          connect,listen,accept,send,recv,close,select特别是前三个,总要做个封装吧,总不能把sockaddr这种东西留给用户层做吧

前面第7点我已经说了,太弱。完全不值得一用!

12.

QUOTE:
原帖由 enigma1983 于 2009-6-24 22:37 发表
7。通讯框架:
           仅仅封装几个系统函数对开发复杂的通讯程序还远远不够吧?
           本框架提供了单进程处理多个socket连接的框架,你只把建好的连接注册进来,再注册一个数据处理函数来处理接收到数据,发送数据时,尽管往缓冲区里发就是了,至于数据怎么缓冲的,各个socket怎么管理的,都不用关心了

同上。

 

 

另一网友提供了 CUer 的类似项目,以做比较:

http://code.google.com/p/sbase/
http://code.google.com/p/traxex/
http://sourceforge.net/projects/traxex/
http://libasdl.sourceforge.net/
http://code.google.com/p/libinet/
http://code.google.com/p/netdkit/
http://sourceforge.net/projects/echozhang/

--------------

启发:

1。代码质量必须由测试代码来保证

2。提供例子程序,以便演示你的功能

3。日志需要更细致的处理

4。尽量采用通用的标准

。。。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter