Pregunta

Quiero hacer esto (sin un idioma en particular):

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

o esto:

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

Donde foo realmente es un servicio conectado a mi programa a través de algún IPC, y para acceder a sus métodos y objetos, alguna capa realmente envía y recibe mensajes a través de la red.

Ahora, realmente no estoy buscando un mecanismo de IPC, ya que hay mucho para elegir. Es probable que no esté basado en XML, sino más bien s. th. como los buffers de protocolo de Google, dbus o CORBA. De lo que no estoy seguro es de cómo estructurar la aplicación para poder acceder al IPC como lo haría con cualquier objeto.

En otras palabras, ¿cómo puedo tener OOP que se asigne de forma transparente sobre los límites del proceso?

No es que esta sea una pregunta de diseño y todavía estoy trabajando en un nivel bastante alto de la arquitectura general. Por lo tanto, soy bastante agnóstico sobre el lenguaje en el que va a estar esto. Sin embargo, es probable que C #, Java y Python se usen.

¿Fue útil?

Solución

¡No deberías hacerlo! Es muy importante que los programadores vean y sientan la diferencia entre un IPC / RPC y una llamada de método local en el código. Si lo hace así, que no tengan que pensarlo, no lo pensarán, y eso conducirá a un código de bajo rendimiento.

Piensa en:

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

El programador asume que los bucles tardan unos pocos nanosegundos en completarse, en lugar de eso toma cerca de un segundo si alguna Lista es remota.

Otros consejos

Creo que la forma de hacer lo que está solicitando es que todas las comunicaciones de objetos se consideren como mensajes pasados. Así es como se manejan los métodos de objetos en ruby ??y smalltalk, entre otros.

Con el paso del mensaje (en lugar de la llamada al método) como su mecanismo de comunicación de objetos, las operaciones como llamar a un método que no existía cuando escribió el código se vuelven sensibles, ya que el objeto puede hacer algo sensato con el mensaje de todos modos (verifique para un procedimiento remoto, devuelva un valor para un campo con el mismo nombre de una base de datos, etc., o arroje una excepción de "método no encontrado", o cualquier otra cosa que se le ocurra).

Es importante tener en cuenta que para los idiomas que no usan esto como mecanismo predeterminado, puede pasar mensajes de todos modos (cada objeto tiene un método 'handleMessage') pero no obtendrá las sutilezas de sintaxis, y ganó No podrá obtener ayuda del IDE sin un esfuerzo adicional de su parte para que el IDE analice su método handleMessage para verificar las entradas válidas.

Lea sobre RMI de Java: el introductorio el material muestra cómo puede tener una definición local de un objeto remoto.

El truco es tener dos clases con firmas de método idénticas. La versión local de la clase es una fachada sobre algún protocolo de red. La versión remota recibe solicitudes a través de la red y realiza el trabajo real del objeto.

Puede definir un par de clases para que un cliente pueda tener

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

Y el servidor recibe las solicitudes de método set_this () y save () de una conexión de cliente. El lado del servidor (generalmente) no es trivial porque tiene un montón de problemas de descubrimiento y administración de instancias.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top