日期:2014-05-20  浏览次数:20960 次

反驳眼镜哥对我的误解-------再谈谈C#和Java
呵呵 眼镜哥好犀利!这样骂人是不是自己受伤了?!看过眼镜哥的博客,里面关于C#的很多,咱实话实说,其实我自己是严重属于C#派系的,我之所以发发这篇牢骚,无非是在最近的一个图形算法项目中,我发现面向对象毫无用武之地,不仅如此,而且还发现非常碍事!哎,研究算法真是令我蛋疼!!!

 

  如实的说,面向对象在设计组件时,感觉是屡试不爽,比如ASP.NET ,WinForm,WPF,Spring,JavaFlex.....

 

但是在除此之外的地方让我多少都感到有些蹩脚,举一个C#的例子,我以前在学习C# Regular时,发现Capture竟然也是一个类,不仅如此,我仔细研究下它的继承体系,令我苦笑不得----有必要这样设计吗?又是关联的、又是依赖的、又是组合的...总之继承+组合+再加一些设计模式,学习RegExp目的就是你如何应对特定问题写出正确高效的模式,而你学习C#正则式时----对不起,先研究下它的继承体系!其实一个类就可以搞定的,你干吗弄这么复杂,有点设计过渡!看看C++的正则式,就一个类嘛,Javascript的正则式,会打两个"\\",你就可以工作了。

 

还有关于Emit的体系,你能想想构建一个程序集用Emit有多么恶心,还有CodeDom体系...当然还有一些好的地方,比如ADO.NET关于不同数据库连接的设计,这个就非常好,现实中和很多项目中都有类似的问题,这个设计就比较经典,显得无懈可击,感觉设计用到正点上了,而有些东西感觉是用面向对象对算法、业务逻辑的霸王硬上弓,用上之后会使本来简单的问题变得更加复杂,让人摸不着头脑

 

当然,在进行组件设计时,面向对象还真是个好东西,这种思想体现的淋漓尽致,纵观一般性的软件,大到操作系统,小到QQ,迅雷,大致上代码分为2/8原则,20%的是核心算法、业务逻辑代码,80%的是图形界面,别看windows系统源代码这么嚣张,其实Window NT刚出道时核心的代码也不过20万多行,当然,这已经是个天文数字了!

 

我多少是写过一些C 的SDK代码的,在学习Windows API时,对句柄的印象特别深刻,发现Windows本身就是很面向对象的,比如CreateWindow,这相当于实例化一个对象,返回一个句柄就是在堆上创建了一个对象,然后我们可以调用ShowWindow、DestroyWindow、SendMessage……,注意这些方法都是需要CreateWindow的返回值做参数的,就相当于Window w=new Window();w.ShowWindow()、w.DestroyWindow….,当然了,SendMessage就有些多态的味道了。Windows下几乎所有资源如进程、文件、内存等等都是这样处理的,据说Linux的源代码中,也是把面向对象的思想体现的淋漓尽致的

 

当然啦,你不能说C是面向对象的,看看C项目中的一些代码,这些swith case成百上千,这些if 嵌套和for循环混合在一起成白上千,每当看到这些代码你是不是有些蛋疼,是不是有些想重构的冲动,那么就看看“重构代码的七个阶段”( http://coolshell.cn/articles/5201.html)。据说Windows下的那个著名的DefWinProc函数就有上千条case语句,典型的意大利面条,这时你不得不有些感想----编程应该体现的是What,,而不是How!!!

 

其实C语言本身也是可以实现面向对象的,这里涉及到两个问题,一个是宏,一个是函数指针,你见过C语言函数有传递类型的吗?用宏就可以实现,至于函数指针,你懂的!

这不,有一本研究C语言实现面向对象的书,还有一个台湾人写的用以实现面向对象的宏包,这些资料我就不列举了,这是不是很有趣,有谁傻到用C学习面向对象,可事实上Windows和Linux把这些发挥的淋漓尽致!!!

 

  C++是面向对象的,果真就如此简单吗?实质上C++早期就是用C的宏实现的,用C实现C++编译器那是后事,C++那些被称作宝石的东西,其实更多的是用了它的模板机制和函数指针,至于C++的图形组件库,你搞过MFC,你懂的!

 

  至于C#和Java,除了搞搞界面,我不知道它们还能干些啥(其实它们能干的很多),说C#和Java是屎,那么面向对象就是狗,他们加起来就是狗屎。

你知道C# int类型有多少方法吗?五六个吧,错!30多个

我心血来潮,想学习下mscoree.dll,发现是C++,而且还是2008的

.。。。

面向对象-----我欣赏它,是因为没有面向对象的语言体现它时,Windows和Linux把她发挥的淋漓尽致;我抱怨它,是因为有这么优秀的C#和Java面向对象语言时,把面向对象体现的像狗皮膏药,到处乱贴;更可悲的是,在C/S和B/S泛滥的时代,我们有可能成为代码民工,那种抄袭代码的风气,那种典型的实用主义,那种投机取巧的作为,那种浮躁的心态,…….相对这些人,有的狗屁不通,还大放厥词,把我们这个行业祸害不轻,今天不拆他们这些人的台,明天就是拆我们自己的台

 

我希望,对待一个问题,我们首先能冷静下来,沉住气,有自己的独立思考性和创造性,同时尊重那些独立思考和创新的同行,好比你发现一个网站做的很有创意,在它需要捐款时你能做为技术人员伸出自己的微薄之力,就像这样的小事情,你不仅是在帮助别人,同时也是对创新的一种欣赏和尊重,是净化我们行业,最终受益的还是我们这个行业所有人

 

小弟不才,不是什么高手,顶多算是个入门级的程序员,但是我即然干上这一行,就要爱上这一行,拿出自己的兴趣和激情去研究和学习,踏踏实实的做好每一步。做好这些确实挺困难的,因为几乎没有不带任何商业性的纯粹技术,在生活和环境的压力下往往显得有些急功近利,这时我们更应该珍惜自己独立思考和创造的空间,要保证自己最起码的不做恶-----不要乱抄袭!!!

 

对于眼镜哥的2B之言,我感觉过了,其实我和你都是同道中人,都算是C#派系的,在这方面我当然力挺C#,我之所以出于对C#的讥讽和批评,也是源自对现实的无奈,如实的说,在语言上,我感情上比较喜欢C#,而且C#投入的时间和钻研也比较多,而对于它的一些受用群体,鄙人实在不敢恭维!

 

在一般的本科院校以上和一些社会上的培训机构大多以Java为立足点,他们往往说Java相比C#开源、跨平台、安全性好、性能比较稳定、效率高,我的个天呀,相信眼镜哥一定很气愤,每每遇到这样的说辞,我就想辩论一番、挑战一番,看看你的C#到底有多噪,看看你所说的Java到底优秀哪了。

 

Java之父这个人,怎么说呢,你说你一个搞技术的没有非技术才能还老是往非技术上插一杠子,没有Bill Joy 你也成不了什么气候,人家是软硬兼施,技商通吃,是Sun响当当的创始人和核心人物,也没像你一样到处往自己脸上贴金,还是人品有问题,现在如丧家之犬,不招人待见,被Oracle踢吧,被Google踢….


------解决方案--------------------
探讨
但是在除此之外的地方让我多少都感到有些蹩脚,举一个C#的例子,我以前在学习C# Regular时,发现Capture竟然也是一个类,不仅如此,我仔细研究下它的继承体系,令我苦笑不得----有必要这样设计吗?又是关联的、又是依赖的、又是组合的...总之继承+组合+再加一些设计模式,学习RegExp目的就是你如何应对特定问题写出正确高效的模式,而你学习C#正则式时----对不起,先研究下它的继承体系!其实一个类就可以搞定的,你干吗弄这么复杂,有点设计过渡!看看C++的正则式,就一个类嘛,Javascript的正则式,会打两个"\\",你就可以工作了。