5

Digamos que tiene un Cliente y un Servidor que desea compartir/sincronizar los mismos Modelos/Objetos. Los modelos apuntan el uno al otro, y usted quiere que sigan apuntando al mismo objeto después de ser enviados/serializados entre el cliente y el servidor. Mi solución actual parece más o menos así:Patrón/Biblioteca para enviar objetos a través de la red, manteniendo los indicadores

class Person { 
    static Map<Integer,Person> allPeople; 
    int myDogId; 

    static Person getPerson(int key){ 
     return allPeople.get(key); 
    } 

    Dog getMyDog() { 
     return Dog.getDog(myDogId); 
    } 
} 

class Dog { 
    static Map<Integer,Dog> allDogs; 
    int myOwnersId; 

    static Dog getDog(int key) { 
     return allDogs.get(key); 
    } 

    Person getMyOwner() { 
     return Person.getPerson(myOwnersId); 
    } 
} 

Pero no estoy muy satisfecho con esta solución, los campos son enteros y esas cosas. Esto también debería ser un problema bastante común. Entonces, lo que estoy buscando aquí es un nombre para este problema, un patrón, solución común o una biblioteca/marco.

+0

por cierto. Descubrí que hay un nombre para la técnica 'Mapa estático', llamado [el patrón de multitonos] (http://en.wikipedia.org/wiki/Multiton) – kornfridge

Respuesta

2

Hay dos problemas aquí.

  • ¿Está replicar los datos en el cliente y el servidor (si es así, ¿por qué?) O no uno, el otro o un agente de base de datos de sostener el modelo?
  • ¿Cómo accede cada agente (es/es) el modelo?

Si el modelo sólo se lleva a cabo por un agente (cliente, servidor de base de datos), entonces los otros agentes necesitan una manera para consultar a distancia el modelo (por ejemplo, objeto enumeradores, captadores y definidores para diversos campos) operando en entidades de modelo abstracto (por ejemplo, identificadores de elementos de modelo, que podrían implementarse como enteros como lo ha hecho).

Independientemente de quién tenga el modelo (uno o todos), cada modelo se puede implementar de forma natural. La implementación normal tiene cada objeto simplemente se refiere a otros objetos usando referencias de objetos normales, como si hubiera codificado esto sin pensar en compartir entre agentes, y a diferencia de lo que hizo .

Puede asociar un objeto con cada objeto, como lo ha hecho, pero su aplicación no es necesario que lo use; solo es necesario cuando se hace referencia a una copia remota de del modelo. Si este objeto está asociado con cada objeto como un campo especial , una tabla hash o se calcula sobre la marcha es solo un detalle de implementación.

Una forma de manejar esto es calcular el objectid sobre la marcha. Puede hacer esto si hay un árbol de expansión canónico en todo el modelo. En este caso, el objectid es "solo" la ruta desde la raíz del árbol de expansión hasta la ubicación del objeto. Si no tiene un árbol de expansión o es muy costoso de calcular, puede asignar objetos a medida que se crean objetos.

El problema real con un modelo distribuido duplicado, como ha sugerido, es mantenerlo actualizado con ambos agentes actualizándolo.¿Cómo previene que cree un objeto (una asignación de un objeto) al mismo tiempo como el otro, pero los objetos que se crean son diferentes con el mismo objeto, o lo mismo con diferentes Objectids? Necesitará bloqueo remoto y señalización para mantener los modelos sincronizados (este es el mismo problema que "coherencia de caché" para múltiples CPU, solo piense en cada objeto actuando como una línea de caché). La forma en que generalmente se resuelve es designar quién posee la copia maestra (quizás de todo el modelo, tal vez de objetos individuales dentro del modelo) y luego realizar consultas, leer , leer-con-intento-modificar, o escribe para asegurarse de que el modelo completo "único" se actualice.

0

La única solución que conozco es enviar la estructura completa, es decir, perros y personas a través de la red. Luego terminarán señalando la copia correcta en el otro lado de la red. La implementación de esta solución, sin embargo, depende de muchas circunstancias. Por ejemplo, cuando su relación de inclusión define un árbol, puede abordar este problema de forma diferente que si se tratara de un gráfico con ciclos.

Eche un vistazo a this para obtener más información.

Cuestiones relacionadas