从编程看出道家思想

最近小弟一直在想啊,强类型语言好那,还是弱类型语言好,从个人感情上而 言,小弟最初学的是JAVA(其实应该是C,没学好不敢说自己学过呵呵~),后来又学了C#,都是强类型语言,后来工作了,因为需要,“被逼”学了js。  

小弟有想,强类型语言就像石头,它是什么样子就是什么样子的,你要改变它必须花点力气,例如:我们把一个学生实体强转成老师实体是肯定不行的,但小弟有在想啊,我以前有个兄弟读大学的时候是学生,毕业了后留校当了老师了,那我们用程序怎么实现那?按强类型方式:

老师类.姓名 = 学生类.姓名

老师类.性别 = 学生类.性别

。。。。。。

对它们一一的装箱拆箱,这样很严谨。

后来啊,我们发现如果属性一多,这样搞不是办法啊,微软给了我们一个扩展方法CopyFrom,在Java里也给我们了一个方法BeanUtils,真的方便不少。但我们不难看出啊,CopyFrom是Object的一个扩展,它接受的参数也是Object,而Beanutils的二个参数也是Object。要是有人说Object是强类型,恐怕太牵强了吧。那为什么要用Object那?为什么所有的类,最终的基类都是Object那?

突然想起有人说, CopyFrom或者Beanutils消耗性能,是啊,明显类型之间的参数复制是用反射机制。哎~,然后小弟做了下测试,发现这样的上万的转换也在毫秒级之间,但好处多多啊,难怪很多流行框架都想放设法模糊类型,有强化类型。在程序里弱化类型,在配置文件里强化类型。真是刚柔并济啊。如此的弱化类型是不是类似于道家的无为(我不去做任何类型的强转或者控制,以及装箱拆箱,我只是告诉他你只要这样放就行了,但在这样做之前可能有人为你做了很多)——说明下道家的无为不是真的什么都不做,而是顺其自然,合乎规律的做,不搞吓折腾,什么是吓折腾那?(例如:现实开发中,产品部的老大们告诉你现在有点小的属性要改下,或扩展几个属性,然后你把数据库里添上字段,然后那,我们在实体里添加字段,随后我们在N多代码里在添加上装箱和拆箱的工作,或者告诉你在这类功能前我们要添加一个功能,我们写完这个功能,很辛苦的在每个类似的功能里把调用的代码加上,突然产品部说,客户不需要这些了,很郁闷的一个个把代码去掉,当然有版本控制器可以帮你)。

同时我们可以看出,Object其实是一种”自然规律“的外在表现,对象总是存储在内存里的,CopyFrom也好Beanutils也罢,它们的巧妙实现,都是在附和这个"自然规律",只是在“无为”的中建立了一定的有为。

在谈下什么叫“顺其自然,合乎规律”

人的吃喝拉撒是顺其自然,生老病死是顺其自然。违背自然也行,例如:我们把男人变成女人,行啊,这种“类型转换”现在的医学技术能够做到,也就是割了小JJ吗?隆个胸吗?操作步骤多麻烦啊?而且医生经常还可能发生错误,或者达不到顾客需求而反复做手术。但自然选择你发育成男胚胎则生男,发育成女胚胎则生女何其简单,何其自然,但这简单和自然之间,有无穷的复杂(CopyFrom中要写比装箱拆箱可能更多的代码,何况它本身也是一种装箱拆箱)。同时我们还能够看到,做变性手术后的“类型强转”未必完美(变性人有生育能力吗?好比装箱拆箱总是无法做到不动代码而实现),而自然人那(基本上完美无缺,有缺陷的可能是因为老天爷有遗漏的Exception未处理。好比CopyFrom总是能够在不断的扩展中满足需要,而无需动手术)。从程序角度看,我们手动的装箱和拆箱是不是一种强制的变性手术那?而CopyFrom是一种合乎自然的规律。这样的说法可能有点牵强,你可以把它看成原本就存在的规律,它好比女人的子宫,二个Object是精子和卵子,谁获得父亲的基因更多,或者母亲的基因更多,取决于你这个上帝把Object放置的位置,至于是“男”是女吗?看你怎么定义实体的。在做装箱拆箱的时候,你充其量是个蹩脚的变性手术大夫,而且怎么整可能还不取决于你,可能你要多次动手术,才能够满足客户的需求,而你用CopyFrom那你就是上帝,你想让“他”或“她”像母亲一样的女人,或者想父亲一样的男人,都取决于你,无论“他”父母是谁,你只需要运用你制定的“自然规律”就行。你愿意当上帝还是蹩脚的变性手术大夫那?

道家还说:"刚者折,而柔者存"

在刚入行前,小弟公司的产品部把设计完的需求直接发给我们编码,小公司没有系统分析师,需求吗肯定有纰漏,小弟还没写代码,就告诉小弟这个有点变化,然后小弟很爽气的和他说,不要紧你说吧。后来,我在编码过程中有和我说,有变化,小弟略带无奈的说,你说吧。最后,等小弟完成了该工作项后,有和小弟说有变化,小弟极度无奈的说,说吧。大家可以看出小弟何其”痛苦“啊(相比大家都会有这样的遭遇),小弟过去写代码很严谨,该怎么样就怎么样,结果还是玩不过产品部的老大们,只能向天长叹,无尽的需求啊!~,然后,小弟冥思苦想,Spring给小弟一个启蒙,小弟的JSON进阶六-自动组装 中的JsonSerializer也是为了对付产品部的老大们而搞的,类似的编码,在C#里和JAVA里估计完成需要更多的代码,而JS可能很少。

例如我们写个JS的CopyFrom或Beanutils

function Beanutils(obj1,obj2){

     for(var key in obj1){

        obj1[key] = obj2[key];

     }

}

简单的几句代码,这个就是弱类型语言的好处,从微软的var到Ruby的出现可见,弱类型语言更有生命力,是不是很合乎 "刚者折,而柔者存"的道理,但也可以看出强类型语言中弱化类型的写法,性能上降低了,但可重用性,可维护性提高了,当然我们也需要明确一些东西,刚柔并济,才能屹立不倒啊!

水的特性是置于方则方,置于圆则圆(你让我成为啥就是啥),弱化类型是不是像水?程序里用这样的“水",正合乎了:“上善若水,水利万物”啊!

 小弟拙见(只当娱乐大众哈哈~),望众高人多多指教啊~

原文地址:https://www.cnblogs.com/KangC/p/1401895.html