这篇从开发语言的角度而不是开发方法来讨论面向对象。因为开发方法是一个远比开发语言范畴大得多的主题。

JAVA有两套系统:一是interface,一是class。

两者都可以经继承生成庞大的HIERARCHY。

这个是语言的角度。与价值没关系。而程序的价值就是语义承载或者形式化,所以现在看看两套系统分别与这个的关系如何。

INTERFACE其实是JAVA中唯一的语义承载体,或者说形式化手段。注意现在有专门研究形式化语义的,那个是与此完全要反的论题,因为它研究的是形式的语义,而这里是研究语义的形式,方向完全不同,所以不要混淆。

也就是说,INTERFACE负责向上,而CLASS负责向下。CLASS是与机器相关的,而INTERFACE是与问题域相关的,与语义相关的。研究过JDBC的就会知道,JDBC顶层全部是接口,并且整个JAVA SDK的JDBC包中也没有实现。所有实现都是未知的,都由运行时你采用的DRIVER决定。而DRIVER显然其实不只是要面对机器,它还要面对DBMS。所以说DRIVER是向下的,而JDBC是向上的。JDBC只是个接口,一个大接口-Application Programming Interface,即应用程序编程接口。

现在有一种编程方法中CODE TO INTERFACE。指的是在实现过程中,你永远应该调用或声明接口。这个有点矛盾听上去,但其实不是。因为调用本身就是实现,而实现又要去调接口。但实际上其实不是这样,因为不管调与不调,实现还是实现,接口还是接口。要能够分清楚静态的程序与动态的程序。当说CODE TO INTERFACE时,指的不是运行时,指的是静态的程序。因为真正的运行时,其实跟接口是没有关系的。因为接口没有任何真正具有意义的指令,只是一个标志化的代码位。

强调接口与实现分离,我觉得主要其实也是一种提升系统语义的渴望。因为不分离的话,你写来写去都是围着机器转的。只有实现了这个分离,才可能真正实现围绕着问题域转,也才可能实现对问题域的真正形式化。所以才有JAVA的这两套系统。

你的系统设计,应该全部是抽象的。比如你分析完或者说做完你对问题域的对象建模以后,你并不应该立马把这些东西对应成“对象”,而是应该把它们抽象化。抽象成接口。或者说从一开始你就是这么想的。

这里的唯一问题是,接口应该做到哪个层次。I MEAN,JAVA显然提供了两套完整的系统,一个对机器一个对语义,但是我们是不是也要像它一样,为两者提供完全对等的地位,即---为系统设计两套完全等同的东西?非也!因为已经说过几遍的,一个对机器一个对语义。对机器有对机器的做法,对语义有对语义的做法。再拿JDBC举例,JDBC是负责语义的,数据库连 接即DBC语义,所以JDBC API的责任就是向上提供这些语义。这个毫无争辨的。必须的。而与此相反,JDBC DRIVER就不是这样的,JDBC DRIVER是面向机器的,它要做的是DRIVER 机器,让机器工作,让数据库工作。这是它要做的事情。

其实,INTERFACE与CLASS的关系就像是上级与下属的关系。因为上上级并不关心上级怎么完成工作,而上级也不关心其下属怎么完成工作。因为各自都有各自的工作范围。各自向上提供各自的服务,而其手段则是利用更下层的服务。

JAVA提供的只是语言层次的工具。按道理,两套系统的分别存在,从语言层次上说,已经足够了。因为这个系统的灵活性非常大。我并不认为INTERFACE就足以表达自然语言中所有的语义,我不认为它的语义形式化能力已经登峰造极,但是我认为,它建立了一个非常牢固的基础。而在这个基础上,一方面是以后的事情,一方面是我们自己的事情,另一方面还是标准的事情。比INTERFACE语义层次高的东西当然多了,如SERVLET,JAVABEAN,EJB,JMS,,等等JAVA里面所有的概念,所有的API,都提供比纯粹的,简单的INTERFACE多的语义。

API,与I,要知道这两者的区别。I是给你用的,API也是给你用的。你用它干什么,?写“对象”啊!

写你自己的对象。