编辑:
为了避免进一步的混乱:我不是在谈论Web服务之类的东西。我说的是内部构造应用程序,而不是计算机如何通信。它涉及编程语言,编译器以及命令式编程范例的扩展方式。
原版的:
在命令式编程领域中,我们在过去的20年(或更长的时间)中看到了两种范例:面向对象(OO)和面向服务(SO)。基于组件(CB)。
两种范例都通过引入它们自己的模块概念来扩展命令式编程范例。OO将它们称为对象(和类),并使它们将数据(字段)和过程(方法)封装在一起。相反,SO将数据(记录,bean等)与代码(组件,服务)分离。
但是,只有OO具有本机支持其范例的编程语言:Smalltalk,C ++,Java和所有其他JVM兼容,C#和所有其他.NET兼容,Python等。
SO没有这样的母语。它仅在过程语言或OO语言之上才存在:COM / DCOM(二进制,C,C ++),CORBA,EJB,Spring,Guice(所有Java),...
这些SO框架显然遭受其概念缺少本地语言支持的困扰。
- 他们开始使用OO类来表示服务和记录。这导致在设计中,仅具有方法的类(服务)与仅具有字段的类(记录)之间存在明显的区别。然后,通过类的继承模拟服务或记录之间的继承。从技术上讲,它并没有那么严格,但是一般来说,建议程序员使类仅扮演两个角色之一。
- 他们使用其他外部语言来表示缺少的部分:IDL,XML配置,Java代码中的注释,甚至像Guice中的嵌入式DSL。由于服务的组成不是服务代码本身的一部分,因此特别需要但不限于此。在OO中,对象创建其他对象,因此不需要此类工具,但是对于SO而言,是因为服务不会实例化或配置其他服务。
- 它们在OO(早期的EJB,CORBA)之上建立了一个内部平台效果,程序员必须在其中编写“驱动” SO所需的所有代码。类仅表示服务性质的一部分,必须编写许多类才能一起形成服务。所有这些样板都是必要的,因为没有SO编译器可以为程序员做。就像有些人在没有C ++的情况下在C for OO中所做的那样。您只需将保存对象数据作为第一个参数的记录传递给作为方法的过程。在OO语言中,此参数是隐式的,并且编译器将生成我们为虚拟功能等所需的所有代码。对于SO,显然没有此功能。
- 特别是较新的框架广泛使用AOP或自省功能将缺少的部分添加到OO语言中。这没有带来必要的语言表达能力,但是避免了上一点中描述的锅炉平台代码。
- 一些框架使用代码生成来产生样板代码。XML的配置文件或OO代码中的注释是此信息的来源。
并非我上面提到的所有现象都可以归因于SO,但我希望它清楚地表明需要使用SO语言。由于这种范例如此流行:为什么不存在一个范例?或者也许有一些学术论文,但至少该行业不使用。