主题:[原创]C++最重要的语法-const, private
公司有个同事也是使用C++开发,代码质量从我个人角度来看感觉非常差,几个明显地方:
1、类、对象的概念非常混乱,某些类只能生成一个对象,多了肯定有问题了。这导致无法在一个进程中监听多个端口,当然人家的解决办法就是用多进程。
2、类与类之间强耦合,可以说除了一些小工具类以外,没有任何一个类可以单独拿出来使用,所有类里面的成员都是public,因为你不知道哪个其它类还要使用这个成员。线程函数因为要访问对象的成员,所以类也是全public,我实在看不过去了,把线程成员改成private,线程函数加上friend了,也被批为语法太花梢。。。当然也就不可能搞什么单元测试了,整个程序都是写好了编译好,连上数据库运行,再写个TCP或UDP的客户端来测试。。倒是很黑盒。。。。
3、BIG THREE显然完全不知道是什么东西。不能拷贝的东西把拷贝构造函数和operator=给private掉亚。
4、由于对C++以及STL的不熟悉,导致根本不敢用STL。问过原因,说是内存卸漏,我猜是因为string的COW吧,多个线程共享string时拷贝可能会有问题,本来只需要禁止掉这些拷贝就行了,他的解决办法是自己写一个string,内部是一个大的数组,当然一些潜在的拷贝成本人家也不考虑了,这个数组只有构造函数和2个public成员,要用字符串方法?找str*吧。。。
5、所有接口参数用的都是char*而不是const char*,所有不修改内部状态的方法都没有加上const。结果我在使用这些方法时不得不加上const_cast<char*>(str.c_str())。。。人家还说我的用法太丑了,郁闷不?也不好意思说。
6、跨平台就跨平台吧,用点宏无所库。不过别滥用嘛,长连接短连接也用一个宏分别编译,结果是一个进程中无法同时存在一个长连接和一个短连接。。。
7、代码风格。说不上是C还是C++还是其它风格,反正是混合体。
8、TCP接收写得很糙,收一下就结束,当然数据比较少还是可以用的。
9、所有工具类的封装都让我感觉别扭,比如一个TcpListener类只有一个listen和accept方法,封装的唯一原因是把一些参数设置加进去,accept完成一些连接的IP限制、连接的超时设置等功能,当然由于他的风格,这些功能也是从一个全局的g_pApp读取参数。。。。顺便说一下,这个g_pApp在各个类中都要用到的,它是所有对象的集合,这个大的蜘蛛网以它为中心。。。
10、锁成本不计。观点是不要锁的太久,否则影响其它线程。于是代码写成这样:
Java代码
int threadFlags[THREAD_COUNT];
// ......
for(int i=0; i<THREAD_COUNT; i++)
{
lock();
if (threadFlags[i] == 0)
......
unlock();
}
int threadFlags[THREAD_COUNT];
// ......
for(int i=0; i<THREAD_COUNT; i++)
{
lock();
if (threadFlags[i] == 0)
......
unlock();
}
11、死代码、废代码、无用注释随处可见。死代码指的是硬编码,上面说的长连接短连接不同共存本身也是硬编码;配置文件也被硬编码了,换一种配置文件西式,很多代码要重写;策略的东西也被硬编码,因为一些策略就是写在配置文件中的。废代码指的是根本用不到的代码,由于上面的一些原因,某些代码不能从项目中拿掉,所以他现在的复用方式就是把一个旧项目拷贝一份去修改。无用注释也很多,主要是一段代码可能在某个项目中有用,在另一个项目中无用,于是注释掉,以防再拷给下个项目使用时可能又用到这段代码。。
原文来自于:[url=http://www.azstv.com]http://www.azstv.com[/url]
1、类、对象的概念非常混乱,某些类只能生成一个对象,多了肯定有问题了。这导致无法在一个进程中监听多个端口,当然人家的解决办法就是用多进程。
2、类与类之间强耦合,可以说除了一些小工具类以外,没有任何一个类可以单独拿出来使用,所有类里面的成员都是public,因为你不知道哪个其它类还要使用这个成员。线程函数因为要访问对象的成员,所以类也是全public,我实在看不过去了,把线程成员改成private,线程函数加上friend了,也被批为语法太花梢。。。当然也就不可能搞什么单元测试了,整个程序都是写好了编译好,连上数据库运行,再写个TCP或UDP的客户端来测试。。倒是很黑盒。。。。
3、BIG THREE显然完全不知道是什么东西。不能拷贝的东西把拷贝构造函数和operator=给private掉亚。
4、由于对C++以及STL的不熟悉,导致根本不敢用STL。问过原因,说是内存卸漏,我猜是因为string的COW吧,多个线程共享string时拷贝可能会有问题,本来只需要禁止掉这些拷贝就行了,他的解决办法是自己写一个string,内部是一个大的数组,当然一些潜在的拷贝成本人家也不考虑了,这个数组只有构造函数和2个public成员,要用字符串方法?找str*吧。。。
5、所有接口参数用的都是char*而不是const char*,所有不修改内部状态的方法都没有加上const。结果我在使用这些方法时不得不加上const_cast<char*>(str.c_str())。。。人家还说我的用法太丑了,郁闷不?也不好意思说。
6、跨平台就跨平台吧,用点宏无所库。不过别滥用嘛,长连接短连接也用一个宏分别编译,结果是一个进程中无法同时存在一个长连接和一个短连接。。。
7、代码风格。说不上是C还是C++还是其它风格,反正是混合体。
8、TCP接收写得很糙,收一下就结束,当然数据比较少还是可以用的。
9、所有工具类的封装都让我感觉别扭,比如一个TcpListener类只有一个listen和accept方法,封装的唯一原因是把一些参数设置加进去,accept完成一些连接的IP限制、连接的超时设置等功能,当然由于他的风格,这些功能也是从一个全局的g_pApp读取参数。。。。顺便说一下,这个g_pApp在各个类中都要用到的,它是所有对象的集合,这个大的蜘蛛网以它为中心。。。
10、锁成本不计。观点是不要锁的太久,否则影响其它线程。于是代码写成这样:
Java代码
int threadFlags[THREAD_COUNT];
// ......
for(int i=0; i<THREAD_COUNT; i++)
{
lock();
if (threadFlags[i] == 0)
......
unlock();
}
int threadFlags[THREAD_COUNT];
// ......
for(int i=0; i<THREAD_COUNT; i++)
{
lock();
if (threadFlags[i] == 0)
......
unlock();
}
11、死代码、废代码、无用注释随处可见。死代码指的是硬编码,上面说的长连接短连接不同共存本身也是硬编码;配置文件也被硬编码了,换一种配置文件西式,很多代码要重写;策略的东西也被硬编码,因为一些策略就是写在配置文件中的。废代码指的是根本用不到的代码,由于上面的一些原因,某些代码不能从项目中拿掉,所以他现在的复用方式就是把一个旧项目拷贝一份去修改。无用注释也很多,主要是一段代码可能在某个项目中有用,在另一个项目中无用,于是注释掉,以防再拷给下个项目使用时可能又用到这段代码。。
原文来自于:[url=http://www.azstv.com]http://www.azstv.com[/url]