0

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

print(foo.objects.bookdb.books[12].title);

或这个:

book = foo.objects.bookdb.book.new();
book.title = 'RPC for Dummies';
book.save();

foo 实际上是一个通过 IPC 连接到我的程序的服务,为了访问它的方法和对象,某些层实际上通过网络发送和接收消息。

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

换句话说,我怎样才能拥有透明地映射到进程边界的 OOP?

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

4

3 回答 3

2

我认为做你所要求的方法是将所有对象通信视为消息传递。这就是在 ruby​​ 和 smalltalk 等中处理对象方法的方式。

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

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

于 2008-10-13T11:44:24.677 回答
0

阅读 Java 的RMI——介绍性材料展示了如何对远程对象进行本地定义。

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

您可以定义一对类,以便客户端可以拥有

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

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

于 2008-10-17T02:15:03.917 回答
-1

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

考虑到:

foreach o, o.isGreen in someList { 
   o.makeBlue; 
}

程序员假设循环需要几纳秒才能完成,相反,如果 someList 恰好是远程的,则需要接近一秒。

于 2008-10-13T12:22:41.760 回答