2010-05-18 79 views
6

我正在开发一款可定制船只的太空射击游戏。您可以通过一对雷达图表*增加船舶任何属性的强度。在内部,我代表每艘船作为分类SpaceObject类,其中包含描述该船的各种属性的ShipInfo针对此问题的良好代码体系结构?

我想开发一个相对简单的API,它可以让我提供所有船舶属性的相对优势(从雷达图表允许的最小值到最大值)的一个块(其中一些是简化的底层实际值一组属性)并获取我可以给PlayerShip类(即实例化为玩家船的对象)的ShipInfo类。

我可以开发代码来完成自己的简化属性和实际属性之间的转换,但是我希望提供一些建议,以尽量减少与此转换程序代码交互的痛苦(即没有5 +论据或其他一些废话)。有没有人有任何想法?

* =尚未实际执行,但这是计划。

回答

5

Builder模式怎么样?你可以对你的ShipInfo类的静态FillDefaults方法,然后通过返回您正在使用的,这样的实例的实例方法分配ShipInfo的每个属性:

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

在ShipInfo,这看起来像这样:

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

我认为我需要回顾一下设计模式书,并实际研究它而不是翻阅它。在阅读这个问题并思考如何解决问题时,我完全错过了这个解决方案,我喜欢这种优雅!我甚至经常使用JQuery,并没有建立连接,而JQuery中的一切都使用了Builder模式。 – Ricket 2010-05-19 20:25:25

5

我会说门面模式是完美的那种问题。如果你的方法有5个以上的参数,可以考虑把它们中的至少一部分封装成新的类型。

+0

我不熟悉门面模式;头脑指向我的解释方向? (即使链接到维基百科或计算器会做) – RCIX 2010-05-18 09:45:26

+2

(+1,btw)heh:http://www.google.com/search?q=facade+pattern – ANeves 2010-05-18 09:50:13

+0

http://dofactory.com/Patterns/PatternFacade。 aspx – 2010-05-18 10:57:28

1

好像你想要设置一些属性而不是其他属性,但不是以特定的重要顺序设置,这样你就可以用更多的参数定义重载。

您可以实现以最小的所需值的构造函数,设置默认值等,然后用object initializer设置剩余的相关值:

// 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

不错,虽然我不认为这会工作,因为我有属性块A,我想要翻译属性块B,我正在寻找一种架构,以最大限度地减少与翻译代码交互的痛苦:) – RCIX 2010-05-18 23:35:12

+0

您可以将相同的原则应用到属性块。但是Builder模式对于你想要的东西看起来很好。 – ANeves 2010-05-19 09:35:04