道德经常提到的两个字就是“无”和“有”,那这无和有又是什么样的概念呢?不同的人有不同的解答,在不同的领域也会有不同的诠释。道德经中第十一章说到:
三十辐共一毂(gǔ),当其无,有车之用。
埏(shān)埴以为器,当其无,有器之用。
凿户牖(yǒu)以为室,当其无,有室之用。
故有之以为利,无之以为用。
这一段将无与有的关系说的相当奥妙,“当其无,有X之用”。这段话是什么意思呢?摘自一段网上的译文:
三十根辐条汇集到一根毂中的孔洞当中,有了车毂中空的地方,才有车的作用。揉和陶土做成器皿,有了器具中空的地方,才有器皿的作用。开凿门窗建造房屋,有了门窗四壁内的空虚部分,才有房屋的作用。所以,“有”给人便利,“无”发挥了它的作用。
总的来说,都是需要先有空虚的部分,才能添加相应的部分以实现所需的功能。比如车毂(相当于自行车车轮连着钢筋的部分)要有孔洞的空虚部分,才能将辐条插进去,连接到车轮圈上,这样才能形成可用的轮子,也才能发挥车的作用。再如器皿,要有中间空虚的部分,才能用来装东西,也才能发挥器皿的作用。对于房屋也是一个道理。
那这与我们编程中的抽象、接口及框架又有什么关系呢?
我们知道抽象类一般是基于多个类共同点的抽象,然后要实现具体的功能时,再从抽象类中去继承实现。而在进行抽象的时候,我们并不会直接实现所抽象的部分,只是作了一些声明。比如有公共汽车和摩托车两种机动车,他们的共同点都是机动车,都有速度和加速,所以把这些给抽象出来 ,形成一个类,下面是JAVA的代码:
package com.example; public abstract class Vehicle { public double Speed=1; public abstract void Accelerate(); }
这里,Vehicle是一个机动车的抽象类,Accelerate是加速,但只是声明了,并没有去实现,是一种无,是空的、虚的状态。下面我们再依据Vehicle的Accelerate的空虚部分去添加相应的内容,达到所要的功能。代码如下
package com.example; public class Motorbus extends Vehicle{ @Override public void Accelerate() { // TODO Auto-generated method stub Speed=Speed*2.5; } }
package com.example; public class Motorcycle extends Vehicle { @Override public void Accelerate() { // TODO Auto-generated method stub Speed = Speed * 1.5; } }
我们看到,在公共汽车类Motorbus和摩托车类Motorcycle中各自实现了Accelerate,达到了各自加速的功能。这是将Vehicle的Accelerate的“无”变成了各自的“有”,当无变成有之后,就成了具体的,可利用的。下面是利用的代码。
package com.example; public class Test { public static void main(String args[]) { Motorbus motorbus=new Motorbus(); Motorcycle motorcycle=new Motorcycle(); System.out.println("Motorbus:"+motorbus.Speed+" Motorcycle:"+motorcycle.Speed); motorbus.Accelerate(); motorcycle.Accelerate(); System.out.println("Motorbus:"+motorbus.Speed+" Motorcycle:"+motorcycle.Speed); } }下面是利用的效果图。
所以我们可以看到,从无到有的过程,无是一种抽象的、待实现的,而有是一种具体的、已实现的。而且不只是从无到有,还可以从有到无。也就是当我们有多个功能相似的具体类时,可以抽象成一个抽象的类或者接口。这样就实现了优化,提高了效率和可维护性。
对于接口也是类似的理解。对于框架也是类似的。比如.NET框架、Android框架,都是对一种高度的无,我们依赖于这些框架可以实现所要的功能,比如基于.NET框架可以实现WinForm/WPF等程序,又如基于Android框架可以做出所要的App。
对于道德经中的无和有,类同于佛学中的空与色。空是万物皆空,是形相中的无形相,色是世界诸般,是形相中的有形相。而在编程中的无和有,是抽象与具体、框架与应用,感觉很是奇妙。
以上是个人的浅见。
转载请注明出处