语言无关-设计问题:如何透明地访问IPC机制



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

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

或者这个:

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

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

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

换句话说,我怎样才能拥有在流程边界上透明映射的OOP?

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

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

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

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

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

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

您可以定义一对类,这样客户端就可以拥有

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

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

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

想想:

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

程序员假设循环需要几纳秒才能完成,而如果someList恰好是远程的,则需要将近一秒钟的时间。

最新更新