Language agnostic 设计问题:如何透明地访问IPC机制?

Language agnostic 设计问题:如何透明地访问IPC机制?,language-agnostic,design-patterns,ipc,soa,rpc,Language Agnostic,Design Patterns,Ipc,Soa,Rpc,我想这样做(没有特定语言): 或者这个: book = foo.objects.bookdb.book.new(); book.title = 'RPC for Dummies'; book.save(); 其中foo实际上是一个服务,通过一些IPC连接到我的程序,为了访问它的方法和对象,一些层实际上通过网络发送和接收消息 现在,我不是真的在寻找IPC机制,因为有很多选择。它可能不是基于XML的,而是基于XML的。th。像谷歌的协议缓冲区,dbus或CORBA。我不确定的是如何构造应用程序,以

我想这样做(没有特定语言):

或者这个:

book = foo.objects.bookdb.book.new();
book.title = 'RPC for Dummies';
book.save();
其中foo实际上是一个服务,通过一些IPC连接到我的程序,为了访问它的方法和对象,一些层实际上通过网络发送和接收消息

现在,我不是真的在寻找IPC机制,因为有很多选择。它可能不是基于XML的,而是基于XML的。th。像谷歌的协议缓冲区,dbus或CORBA。我不确定的是如何构造应用程序,以便像访问任何对象一样访问IPC

换句话说,我如何让OOP透明地映射到进程边界上


并不是说这是一个设计问题,我仍然在相当高的总体架构水平上工作。所以我还不知道这是哪种语言。不过,C#、Java和Python都有可能被使用。

我认为实现您的请求的方法是将所有对象通信视为消息传递。这就是ruby和smalltalk中处理对象方法的方式

使用消息传递(而不是方法调用)作为对象通信机制,那么在编写代码时调用不存在的方法之类的操作变得合理,因为对象无论如何都可以对消息做一些合理的操作(检查远程过程,从数据库中返回同名字段的值,等等,或者抛出“未找到方法”异常,或者您可以想到的任何其他情况)


需要注意的是,对于不使用此机制作为默认机制的语言,无论如何都可以进行消息传递(每个对象都有一个“handleMessage”方法)但是,如果您不付出额外的努力让IDE解析handleMessage方法以检查有效的输入,您将无法获得语法细节,也无法获得IDE帮助。

您不应该这样做!程序员在代码中看到并感受IPC/RPC和本地方法调用之间的差异是非常重要的。如果你这样做,他们不必考虑,他们不会考虑,这将导致非常糟糕的代码性能

想想:

foreach o, o.isGreen in someList { 
   o.makeBlue; 
}
程序员假设循环需要几纳秒才能完成,而如果someList恰好是远程的,则需要将近一秒钟的时间。

请阅读Java的介绍性资料,其中展示了如何获得远程对象的本地定义

诀窍是有两个具有相同方法签名的类。该类的本地版本是某个网络协议上的门面。远程版本通过网络接收请求并执行对象的实际工作

您可以定义一对类,这样客户机就可以

foo= NonLocalFoo( "http://host:port" )
foo.this= "that"
foo.save()

服务器从客户端连接接收set_this()和save()方法请求非常重要,因为您有一大堆发现和实例管理问题。

是的,这是一个很好的观点。我也已经考虑过了。但是,这很容易通过命名约定来解决。如果它总是像某些IPCList或ipcFoo.bar(),你知道发生了什么。我不是为一种任意的语言/框架而设计的,而是为一个特定的应用程序和一个特定的团队而设计的。依我看,程序员应该针对一个接口编程,而不知道它背后隐藏着什么。正是这个接口将程序组件粘合在一起,应该考虑一下这一点。
foo= NonLocalFoo( "http://host:port" )
foo.this= "that"
foo.save()