c++的诡异与艺术一例

来源:互联网 发布:网络暴力对策 编辑:程序博客网 时间:2024/04/28 14:48

c++到底是诡异的还是艺术的,可能都是吧,说它诡异是因为没有理解它的精髓,说它艺术那是因为理解了它的精髓,我这里仅以一个实际的例子说明,在工作过程中,我的项目经理让我看一段程序,可能程序的作者根本不懂怎么进行互斥,这足以说明他不是一个合格的程序员,为何说他不懂基本的互斥呢?以下是一个函数:

int in_use = 0;

XXX XXX(XXX yyy)

{

while(in_use == 1)

{

Sleep(1);

}

SyncClass instance(&in_use);

//do_something;

}

很显然,这个in_use的意义就是为了防止这个XXX函数被重入,我说作者不合格的原因是完全可以用WaitForSingeleObject之类的函数来完成,用这种方式就显得太“低级”了,我的项目经理还迷惑于没有发现在什么地方将in_use这个变量设置为1,他在我们的项目出了大问题而又面对这种诡异的代码的时候显得十分气愤,删去吧,万一作者有很什么隐藏的很深的意图呢?不删吧,实在对这种互斥方式不解,然而当我看到这段代码的头文件的时候,一切豁然开朗了,SyncClass的定义如下:

class SyncClass

{

public:

SyncClass(int* _use):m_use(_use)

{

*m_use=1;

}

~SyncClass()

{

*m_use=0;

}

private:

int* m_use;

};

很简单的一个类,在调用构造函数的时候将参数作为一个地址,然后将该地址指向的值设置为1,然后在析构的时候将其设置为0,而函数XXX中只是简单的建立了一个SyncClass对象,调用了其唯一的显式的构造函数,可以看到并没有用这个对象做任何事情,这个对象的意义就在于互斥,c/c++的特性决定了变量的作用域,该对象是一个局部变量,在出去它所在的大括号之外,它就离开了它的作用域,c++中,一个对象离开了作用域就要调用其析构函数,而虚构函数中将互斥变量的值设置为了0。这个方式的好处在于你几乎不用时刻操心在离开函数的时候忘记了释放互斥量。

这个方案是美妙还是诡异,起初,我的项目经理说这种摸不着头脑的代码肯定是一个大学生写的,然而我不赞同他的观点,这个代码恰恰表现了作者坚实的基本功,他可能不懂api,但是他却深刻的理解了c++的精髓,这二者哪一点更重要呢?现在很多程序员api玩得不亦乐乎,但是基本的知识却一问三不知,不知道内存怎么读,不知道int类型的数据在内存的布局,这到底说明这个程序员效率高还是根基不牢?...我其实根本不喜欢那些只会调用API的人,他们可能会是很好的执行者,但是他们很难设计出良好的系统,你难道指望一个根本不懂原理的人去充分挖掘原理性的潜力吗?个版本不可能的。

有人认为搞操作系统的人水平就一定很高,其实不是,搞应用的人水平更高,我这里说的不是编码的人,而是搞设计搞架构的人,大多数的应用要比操作系统复杂的多,要考虑的问题要多得多,随便看一个订单系统的逻辑设计图就会发现它的复杂,特别是高复杂度的面向对象的系统更是如此,设计模式就像是一堵墙,时刻在权衡着设计的优劣。

原创粉丝点击