对于问题,为什么Java如此重视designpattern?我在学习DP之前的感觉是由Java的先天缺陷造成的。十几年前学Java的时候,没有吸引我的主要原因就是这门语言太死板,不够灵活。而我在后来学C#的时候则感觉很对胃口,简单而不失灵活性。那么我在学习DP的时候在wiki上看到了这句话,从而给我的感觉找到了一定的依据。
The design patterns may just be asign of some missing features of a given programming language (Javaor C++ for instance).
我们知道有三种编程方式,面向过程,面向对象和面向函数,那么我就拿我比较熟悉的C,Java,Scala作为三种编程方式的代表来说明一些问题。因为水平有限,理解不一定正确,但是我主要是给自己解惑产生的思考,能不能解你们的惑我不知道,但是至少是解了我的惑了。不过欢迎大家一起讨论。
我认为C, Java,Scala代表了三个不同的世界,那就是机器世界,现实世界和数学世界。我们知道从机器到人是有一大段距离的,离机器越近,则越难理解,但是会更灵活。离人越接近,则离机器越远,更容易理解,但是相应也会更加死板。比如机器码->汇编->C->Java->Python->HTML等等。
C语言代表了机器世界。如果我们从计算机的角度去看程序的话,那就是C语言体现出来的特点,面向过程,变量,并且承认全局变量。因此C语言最能够灵活的掌控计算机。
Java是面向对象的,而面向对象的概念是从现实世界抽象出来的,所以说Java代表了现实世界,也就是说跟人类更接近,基本原则是从现实世界的角度去表达程序,而不在乎机器世界。OO认为世界都是由object组成的,包括程序,算法等等,一切一切。任何不是object的程序设计都是反OO的。OO否认函数和全局变量的存在。但是根据刚才我们对机器世界的分析里是没有object概念的。因此再从OO到机器世界的转变就出问题了,因为并不是所有的东西都是object,机器世界和现实世界是有蛮大差距的。比如OO否认全局变量,但是全局变量是确实存在的,怎么办?Singletonpattern就出现了。OO否认函数的存在,但是很多东西,比如一个算法,一个运算的本质确实是函数而不是object,怎么办?Strategypattern就出现了。
Scala是一门混合型语言,但是理论上是可以编写纯FP的程序的,我们现在讨论的就是FP的部分。FP是从数学表达式的观点去解释程序的,因此代表了数学世界。OO认为程序都应该由object组成,FP则认为程序都应该由function来组成。FP否认变量和命令的存在。这样麻烦就来了,你否认变量,但是机器世界是存在变量的,怎么办?FP就makea new copy。你否认命令的存在,取消了循环,怎么办?那就用递归。但是我们知道递归会造成stack overflow,怎么办?那就用尾递归。
我想说的是,Designpattern是为了解决一些反复出现的问题,但是问题本身的出现有很大程度上是由于计算机语言信仰一种理论而忽略了机器世界而带来的。像C这种贴近机器的语言则很少需要designpattern。比如Singleton用全局变量就解决了,而Strategy用函数指针也就解决了。最后摘抄SteveYegge的一句话作为结尾。
The problem is, about 1/3 to 1/2 of them were basicallycover-ups for deficiencies in C++ that don't exist in otherlanguages
青春就应该这样绽放 游戏测试:三国时期谁是你最好的兄弟!! 你不得不信的星座秘密
网友评论已有0条评论, 我也要评论