今天在论坛看到一个帖子:
“不错,我一开始就是从C语言过来的,如果有电子方面的基础的话,我就想搞硬件开发了,现在搞C#,有点像“拿来主义”,基本不知道其所以然,还是写C++ 的时候心最静,其实,我现在用“类”,就是把一些功能相似的函数放在一起搞成一个类,然后使用,还不如C的函数来的直接,一开始写程序的时候就接收的是面向过程的思维,面向对象细节的实现也是过程的
眼下这个项目快做完了,C,MFC,C#都在用,其实内心真的非常的矛盾,就想只学一种语言,从灵魂的深处出发,我想写C++,每次在深夜写C#写到头昏脑胀时,就会嘶声力竭的大叫“我想写C++”,那种感觉,就像三井寿对安西教练哭着说“我想打篮球”一个样子,可是每次在项目中遇到C++解决不了的难题的时候,我就会“犯贱的”想念C#,矛盾,人就是矛盾的产生 ==》 我就是C++&C#的产物”
看了上面的讨论,我认为根本的问题不在语言。而且,所有的问题,很少能够归咎于语言特性限制的。
这让我想到了《代码大全》这本书中一直强调的一个概念:深入一种语言去编程,而不是在一种语言之上去编程。
其间的区别是,在一种语言之上去编程,思想受限于语言特性的限制;深入一种语言去编程,放在首位的是我们的思想,我们首先要确定我们的思想,之后,要用语言特性去实现它。不要将我们的思想局限于语言特性。
无论是c,c++,c#,我们都可以编写出优秀的代码,这其中,最重要的因素,是你的思想,你的思路,而不是你使用的语言。
举例一:
断言是指在开发期间使用的、让程序在运行时进行自检的代码。断言是一个优秀程序员的一个利器,但是,有些语言并不提供断言机制。那我们就不用断言了吗?非也!我们可以很简单的实现一个断言,比如,在c中:
#define ASSERT(flag)/
{/
if (!(flag))/
printf("ASSERT failed! file=%s, line=%d./n", __FILE__, __LINE__);/
}
举例二:
面向对象有一个非常重要的概念就是封装。在处理全局数据时,一般不会直接的让客户端访问数据本身,而是使用访问器函数。比如,某类中有一个static变量,一般会配备两个函数:1)Set***();//设置函数; 2)Get***()//访问函数。这样做的好处是:1)对外部隐藏实现的细节。2)便于扩展,如果有一天变量要变成结构体,客户端部分可以基本不动,而只修改访问器函数即可。3)存在一个中央控制点,便于定位问题。
但是,如果你使用的c语言,面向过程的,是否也可以使用这种方法来实现封装的好处?答案是可以的。比如,有一个两个文件都需要访问的全局变量,你可以将此文件定义为static,只允许他在其定义的文件内使用。然后,定义两个非static的访问器函数,供客户端来访问此全局变量。这样,你也可以在c中使用封装带来的好处。