Oop 面向服务与面向对象-它们可以共存吗?

Oop 面向服务与面向对象-它们可以共存吗?,oop,soa,service-tier,Oop,Soa,Service Tier,最近,我的公司对(SOA)非常感兴趣。每当我试图看看我们如何使用它时,我总是遇到一个心理障碍。粗略地说: 面向对象说:“将数据和操作数据(业务流程)的方法放在一起” 面向服务说:“将业务流程保留在服务中,并将数据传递给它” 以前开发SOA的尝试最终将面向对象代码转换为数据结构和单独的过程(服务)来操作它们,这似乎是一种倒退 我的问题是:什么样的模式、架构、策略等允许SOA和OO协同工作? 编辑:回答说“OO用于内部,SOA用于系统边界”是非常好和有用的,但这并不是我想要的 假设您有一个Ac

最近,我的公司对(SOA)非常感兴趣。每当我试图看看我们如何使用它时,我总是遇到一个心理障碍。粗略地说:

  • 面向对象说:“将数据和操作数据(业务流程)的方法放在一起”

  • 面向服务说:“将业务流程保留在服务中,并将数据传递给它”

以前开发SOA的尝试最终将面向对象代码转换为数据结构和单独的过程(服务)来操作它们,这似乎是一种倒退

我的问题是:什么样的模式、架构、策略等允许SOA和OO协同工作?


编辑:回答说“OO用于内部,SOA用于系统边界”是非常好和有用的,但这并不是我想要的

假设您有一个
Account
对象,该对象有一个名为
Merge
的业务操作,该操作将它与另一个帐户相结合。典型的OO方法如下所示:

Account mainAccount = database.loadAccount(mainId);
Account lesserAccount = database.loadAccount(lesserId);

mainAccount.mergeWith(lesserAccount);

mainAccount.save();
lesserAccount.delete();
Account mainAccount = accountService.loadAccount(mainId);
Account lesserAccount = accountService.loadAccount(lesserId);

accountService.merge(mainAccount, lesserAccount);
// save and delete handled by the service
而我看到的SOA等价物如下所示:

Account mainAccount = database.loadAccount(mainId);
Account lesserAccount = database.loadAccount(lesserId);

mainAccount.mergeWith(lesserAccount);

mainAccount.save();
lesserAccount.delete();
Account mainAccount = accountService.loadAccount(mainId);
Account lesserAccount = accountService.loadAccount(lesserId);

accountService.merge(mainAccount, lesserAccount);
// save and delete handled by the service
在OO案例中,业务逻辑(以及由于ActiveRecord模式而产生的实体感知)被烘焙到
Account
类中。在SOA案例中,
Account
对象实际上只是一个结构,因为所有业务规则都隐藏在服务中


我可以同时拥有丰富的、功能性的类和可重用的服务吗?

我真的认为SOA只对外部接口有用(一般来说,对于公司以外的接口),即使如此,只有在性能并不重要的情况下,您才不需要有序地传递消息

有鉴于此,我认为它们可以共存。使用OO理念保持应用程序的工作和通信,并且只有在需要外部接口(给第三方)时,才通过SOA公开它们(这不是必需的,但这是一种方式)


我真的觉得SOA被过度使用了,或者至少带有SOA的架构被提议得太频繁了。我真的不知道有哪个大型系统在内部使用SOA,我怀疑它们是否可以。它似乎更像是一种只用于mashup或简单天气预报类型请求的东西,而不是在上面构建严肃的系统。

我的观点是,SOA在宏观层面上是有用的,但每个服务可能仍然足够大,需要几个内部组件。内部组件可能受益于OO体系结构


应该比内部API更仔细地定义SOA API,因为它是一个外部API。在这个级别传递的数据类型应该尽可能简单,没有内部逻辑。如果有一些逻辑属于该数据类型(例如验证),则最好有一个服务负责在该数据类型上运行该逻辑。

SOA是系统或应用程序之间通信的良好体系结构

每个应用程序定义一个“服务”接口,该接口由它将处理的请求和预期的响应组成

这里的关键点是定义良好的服务,以及定义良好的接口。就SOA而言,服务的实际实现方式并不重要


因此,您可以使用所有最新和最伟大的OO技术或任何其他适合您的方法来自由地实现您的服务。(我见过一些极端情况,“服务”是由实际的人在屏幕上输入数据来实现的——但一切仍然是教科书式的SOA!)

我认为这是对面向对象的误解。即使在Java中,方法通常也不是对象的一部分,而是它们的类的一部分(即使这种“成员身份”对于面向对象也不是必需的,但这是一个不同的主题)。类只是一个类型的描述,所以它实际上是程序的一部分,而不是数据


SOA和OO并不相互矛盾。服务可以接受数据,在内部将它们组织成对象,处理它们,最后以所需的任何格式返回。

我听James Gosling说过,可以用COBOL实现SOA

如果你阅读Alan Kay自己对OOP起源的描述,它描述了一群小计算机相互作用以执行有用的操作

考虑以下描述:

你的X应该由Y组成。每个Y都应该负责一个单独的概念,并且应该完全按照其接口进行描述。一个Y可以要求另一个Y通过消息交换(根据其指定的接口)执行某些操作

在某些情况下,X可以由Z实现,Z根据其接口进行管理。不允许X直接访问另一个X的Z

我认为以下替换是可能的:

Term      Programing       Architecture
----    ---------------    ------------
  X         Program           System
  Y         Objects          Services
  Z      Data structure      Database
----    ---------------    ------------
result        OOP              SOA

如果您主要从封装、信息隐藏、松耦合和黑盒接口的角度来考虑,则有相当多的相似之处。如果您陷入多态性、继承等问题,那么您考虑的是编程/实现,而不是体系结构,IMHO。

如果您允许您的服务记住状态,那么它们可以被认为是调用时间可能很慢的大对象

若不允许它们保留状态,那个么它们就像你们说的那个样——数据上的运算符

听起来你可能把你的系统分成了太多的服务。您是否有书面的、双方同意的划分标准


采用SOA并不意味着扔掉所有的对象,而是意味着将系统划分为可重用的大块。

您好,谢谢您的精彩帖子!这几天让我很困惑。5年后你有进一步的结论吗?我真的很想知道今天,在这个答案发布8年后,面向服务的体系结构变得非常流行,许多公司都喜欢Netfl