2010-05-18 7 views
6

Estoy desarrollando un juego de disparos espaciales con naves personalizables. Puede aumentar la fuerza de cualquier cantidad de propiedades del barco a través de un par de gráficos de radar *. Internamente, represento cada barco como una clase subclassed SpaceObject, que tiene un ShipInfo que describe varias propiedades de ese barco.¿Buena arquitectura de código para este problema?

Quiero desarrollar una API relativamente simple que me permita alimentar en un bloque de puntos fuertes relativos (del mínimo al máximo de lo que permite el gráfico de radar) para todas las propiedades del barco (algunas de las cuales son simplificaciones del conjunto de propiedades) y recuperar una clase ShipInfo que puedo dar a una clase PlayerShip (que es el objeto instanciado para ser una nave de jugador).

Puedo desarrollar el código para realizar las transformaciones entre las propiedades simplificadas y reales, pero me gustaría algunas recomendaciones sobre qué tipo de arquitectura proporcionar para minimizar el dolor de interactuar con este código de traductor (es decir, no hay métodos con 5 + argumentos o alguna otra tontería). ¿Alguien tiene alguna idea?

* = no implementado realmente todavía, pero ese es el plan.

Respuesta

5

¿Qué hay del patrón Builder? Usted podría tener un método estático FillDefaults en su clase ShipInfo y luego asignar a cada propiedad de la ShipInfo a través de un método de instancia que devuelve la instancia que está trabajando, así:

ShipInfo.FillDefaults().CalculateSomething(50).AssignName("Testing...").RelativeFiringPower(10).ApplyTo(myShip); 

Dentro ShipInfo, esto se vería algo como:

public static ShipInfo FillDefaults() 
{ 
    ShipInfo newInstance = ...; 
    // Do some default setup here 
    return newInstance; 
} 

public ShipInfo CalculateSomething(int basis) 
{ 
    // Do some calculation 
    // Assign some values internally 
    return this; 
} 

// Keep following this pattern of methods 
public void ApplyTo(SpaceObject obj) 
{ 
    // Some checks here if you want 
    obj.ShipInfo = this; 
} 
+0

Creo que necesito volver a leer el libro de patrones de diseño y estudiarlo en vez de hojearlo. ¡Extrañé totalmente esta solución al leer la pregunta y pensar en cómo la resolvería, y me encanta la elegancia! Incluso utilizo JQuery de forma regular y no establecí la conexión, y TODO en JQuery usa el patrón de Builder ... – Ricket

5

Yo diría que el patrón de fachada es perfecto para ese tipo de problema. Si tiene más de 5 argumentos sobre sus métodos, considere encapsular al menos parte de ellos en un nuevo tipo.

+0

No estoy tan familiarizado con el patrón de la fachada; ¿La mente me señala hacia una explicación? (incluso un enlace a wikipedia o stackoverflow servirá) – RCIX

+2

(+1, btw) heh: http://www.google.com/search?q=facade+pattern – ANeves

+0

http://dofactory.com/Patterns/PatternFacade. aspx –

1

Parece que quiere establecer algunas propiedades pero no las demás, pero no en un orden particular de importancia para que pueda definir sobrecargas con incrementalmente más argumentos.

podría implementar un constructor con valores mínimos requeridos que establece valores por defecto para el otro y, a continuación, utilizar object initializer para establecer los valores pertinentes restantes:

// Didn't set properties 2 3 and 6, only set the ones needed in this case. 
SpaceObject ship = new SpaceObject(someRequiredValue) { 
    Property1 = 50, 
    Property4 = Game.Settings.Ships.Armor.Strong, 
    Property5 = new PropertySet1{ 
    Prop51 = "Enterprise", 
    Prop53 = true, 
    Prop57 = false 
}; 
+0

no está mal, aunque no creo que funcione ya que tengo el bloque de propiedades A que quiero traducir al bloque de propiedades B y estoy buscando una arquitectura para minimizar el dolor de interactuar con el código que hace la traducción :) – RCIX

+0

Puede aplicar el mismo principio al bloque de propiedades. Pero el patrón de Builder se ve bien para lo que quieres. – ANeves