2010-07-26 6 views
5

Estoy diseñando un objeto de juego en F #. En C++, crearía clases para representar el aspecto gráfico, el aspecto físico, etc., cada uno con valores dinámicos, y luego agregaría instancias de esas clases a GameObject. Podría usar el mismo diseño en F # con tipos mutables, pero estoy tratando de mantener todo inmutable. Entonces, si utilizara el mismo diseño estaría recreando miles de objetos grandes en cada cuadro, y probablemente gastaría todo el tiempo de CPU asignado.¿La forma correcta de definir un tipo inmutable grande con piezas que se actualizan?

¿Hay alguna manera en que pueda definir un tipo en el que pueda vincular los valores de otro objeto y suministrar nuevos, para reducir las asignaciones?

Por ejemplo, para cambiar el color de un cuadro, quiero usar la memoria de la antigua caja con una nueva pieza de gráficos, y el uso de memoria del gráfico antiguo de pieza con un nuevo color:

let box = ... 
... 

let changedBox = {box with 
       graphics = { box.graphics with colour = blue} } 

Respuesta

5

Sí, exactamente. Asumiendo que "el objeto grande" es de hecho un gráfico de referencia de muchos objetos más pequeños, la típica "actualización de un inmutable" simplemente crea uno o dos nuevos objetos pequeños y hace referencia a los mismos viejos para el resto.

Por ejemplo, si la persona tiene un nombre y una dirección, y la dirección tiene calle y ciudad y estado y código postal, y necesito actualizar el zip de una persona, entonces solo necesito crear nuevos objetos para el árbol de expansión desde la raíz hasta el Zip. Ver p. los diagramas de color rojo-negro en this blog. En el ejemplo de persona, los objetos Nombre, Calle, Ciudad y Estado se volverían a usar, pero el ZIp sería un objeto nuevo, y la Dirección sería un objeto nuevo (ya que contiene el nuevo Zip), y la Persona sería un nuevo objeto (ya que contiene la nueva dirección). ¿Tiene sentido?

+2

Tiene sentido. Mi problema fue que pensé que los objetos se copiarían, en lugar de reutilizarlos. Gracias Señor. También disfruto leyendo tu blog, es la razón por la que entré a F # :) – Patrick

Cuestiones relacionadas