Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这个问题的代码架构好吗?_C#_Architecture_Oop - Fatal编程技术网

C# 这个问题的代码架构好吗?

C# 这个问题的代码架构好吗?,c#,architecture,oop,C#,Architecture,Oop,我正在开发一款可定制飞船的太空射击游戏。你可以通过一对雷达海图来增加船上任何数量属性的强度*。在内部,我将每艘飞船表示为一个子类SpaceObject类,其中包含一个ShipInfo,描述该飞船的各种属性 我想开发一个相对简单的API,让我为所有船舶属性(其中一些是基本实际属性集的简化)输入一个相对强度块(从雷达图允许的最小值到最大值),并返回一个ShipInfo类,我可以给玩家类(即实例化为玩家飞船的对象) 我可以自己开发代码来进行简化属性和实际属性之间的转换,但是我想知道应该提供什么样的体系

我正在开发一款可定制飞船的太空射击游戏。你可以通过一对雷达海图来增加船上任何数量属性的强度*。在内部,我将每艘飞船表示为一个子类
SpaceObject
类,其中包含一个
ShipInfo
,描述该飞船的各种属性

我想开发一个相对简单的API,让我为所有船舶属性(其中一些是基本实际属性集的简化)输入一个相对强度块(从雷达图允许的最小值到最大值),并返回一个ShipInfo类,我可以给
玩家
类(即实例化为玩家飞船的对象)

我可以自己开发代码来进行简化属性和实际属性之间的转换,但是我想知道应该提供什么样的体系结构来最大限度地减少与翻译代码交互的痛苦(即,没有5+参数的方法或其他类似的废话)。有人有什么想法吗


*=还没有实际实现,但这是计划。

< P>我会说外观模式对于这类问题来说是完美的。如果你的方法有5个参数,考虑把它们的至少一部分封装在一个新的类型中。

看起来你想要设置一些属性而不是其他属性,但不是按一个重要的顺序设置的。您可以使用递增的更多参数定义重载

您可以使用最低要求值实现一个构造函数,为另一个构造函数设置默认值,然后使用来设置其余的相关值:

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

在我看来,这就像是一个案例。

构建器模式如何?您可以在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;
}

我对门面模式不太熟悉;介意给我指出一个解释的方向吗?(即使是维基百科或stackoverflow的链接也可以)不错,虽然我认为这不可行,因为我有属性块A,我想将其转换为属性块B,并且我正在寻找一种架构,以尽量减少与执行转换的代码交互的痛苦:)您可以将相同的原则应用于属性块。但是构建器模式看起来很适合你想要的。我想我需要回顾一下《设计模式》这本书,并实际研究它,而不是翻阅它。当我阅读这个问题并思考如何解决它时,我完全错过了这个解决方案,我喜欢它的优雅!我甚至经常使用JQuery,没有建立连接,JQuery中的所有内容都使用构建器模式。。。