回忆多年前与C程序员共事后的总结

it2025-02-15  5

我曾在某大型项目组与某些高端人事共事(当然我只是个外包),从代码变量命名上可以看出,对方是做C出身,半路出家转JAVA,除了用下划线命名之外,做C的程序员在很多细节上表现与JAVA的编程习惯不一致。

不善于利用异常 C语言中经常出现这样的代码 /*** 返回:1代表成功,0代表失败 ***/ int do_some_thing(int i ){ .... } int stat = do_some_thing(int i); if(!stat){ }

C语言或者像Go的语言中,函数经常返回一个int类型,代表成功或失败。但java中往往利用异常机制。以下是我在H项目组中在Service层中常见的代码片断

Result doSomeThing(...) throws SysException

Result表明成功失败的状态。还有失败原因,以及正确时返回的数据。这个接口很含糊:它申明了一个业务异常,但在编码时经常不知道是抛异常好,还是直接返回Result好,很多做C的返回了Result,他们也不管事务会不会rollback。很多做java的选择了抛异常。

2.从不在condition中调用方法

以下是我在项目中的读流的程序片断,

int i ; while((i=stream.readInt())!=-1){ }

以上的代码在java中非常普遍,但在H项目中却要求改成:

int i = stream.readInt(); while(i !=-1){ .... i = stream.readInt() }

c语言中的condition往往不包含方法调用之类的,但在java中很常见,而且这样写可以减少很多代码,以下是java线程池中的代码片断

if (isRunning(c) && workQueue.offer(command)) { }

如果禁用Condition中的方法调用,程序多出的可不止一行:

bool isRun = isRunning(c); if(isRun){ bool offered = workQueue.offer(command); if(offered){ ... } }

不只多了两个变量,为了完成 && 的逻辑,还要添加一层嵌套。

3.不知道面向对象的专业知识。

在H公司项目组,我做过唯一有成就感的事情是利用面像对象的那套思想,重构了项目中的计费模块。在视检时,项目组H公司的人分成两派,java底子出身的人,很兴奋地看到我用到了工厂和策略模型,没有用到那么多if-else。C出身的一头雾水,他们平时很少用接口,能new的对像就不交给spring管理。 我以前以为或许是C语言没有面向对象的那套东西。但我在了解Linux内核编程知识时,经常看到某个结构体包含了一堆函数指针。我就明白了,原来C的思想中(或者说底层系统中),也有面向对象的概念,只不过实现起来比较麻烦。

最新回复(0)