C# 寻找更好的方法来处理大量参数

C# 寻找更好的方法来处理大量参数,c#,C#,我已经为一个游戏实现了一种形式的引导行为,每次使用编辑器时,设计师应该能够为(当前)七个参数选择它们是否应该是0、随机或设定数量,如果是后两个,随机应该落在哪个范围内,或者变量应该得到哪个设定数量。设置将保存在文件中,并且必须能够随时加载 我最后看到的是一个痛苦的构造函数和一大堆字段和属性。 我正在寻找一种更智能的方法来解决这个问题,尤其是在以后添加更多参数时 使用设置对象-将这些参数重构为一个类并传入该类。您可以添加其他参数而不会出现问题 这被称为a,并且在BCL中的几个地方都使用过——这个类

我已经为一个游戏实现了一种形式的引导行为,每次使用编辑器时,设计师应该能够为(当前)七个参数选择它们是否应该是0、随机或设定数量,如果是后两个,随机应该落在哪个范围内,或者变量应该得到哪个设定数量。设置将保存在文件中,并且必须能够随时加载

我最后看到的是一个痛苦的构造函数和一大堆字段和属性。 我正在寻找一种更智能的方法来解决这个问题,尤其是在以后添加更多参数时


使用设置对象-将这些参数重构为一个类并传入该类。您可以添加其他参数而不会出现问题

这被称为a,并且在BCL中的几个地方都使用过——这个类就是一个


这种方法的另一个好处是,您可以将设置与使用它们的类分开序列化和反序列化。

使用设置对象-将这些参数重构为一个类并传入该类。您可以添加其他参数而不会出现问题

这被称为a,并且在BCL中的几个地方都使用过——这个类就是一个


这种方法的另一个好处是,您可以将设置与使用它们的类分开序列化和反序列化。

建议创建一个类来保存2/对值,然后分组到一个集合中:

public class Steering
{
    public SteerType SteerType{get;set}
    public int Amount{get;set}
}

List<Steering> userSteering = new List<Steering>
  {
     //initialize your list
  };

//pass that list into a constructor.
公共类转向
{
公共SteerType SteerType{get;set}
公共整数金额{get;set}
}
List userSteering=新列表
{
//初始化您的列表
};
//将该列表传递给构造函数。
在你的闲散课上:

private List<Steering> steeringValues;

public IdleSteering(List<Steering> userSteering)
{
    steeringValues = userSteering;
}

//we can now use LINQ to find any particular steering value.
int braking = steeringValues.SingleOrDefault(x=>x.SteerType==Random).Amount;
私有列表steeringValues;
公共怠速(列表用户转向)
{
steeringValues=userSteering;
}
//我们现在可以使用LINQ查找任何特定的转向值。
int braking=steeringValues.SingleOrDefault(x=>x.SteeringType==Random).Amount;

在所有方法之间传递并使用该集合。

建议创建一个类来保存2/对值,然后分组到一个集合中:

public class Steering
{
    public SteerType SteerType{get;set}
    public int Amount{get;set}
}

List<Steering> userSteering = new List<Steering>
  {
     //initialize your list
  };

//pass that list into a constructor.
公共类转向
{
公共SteerType SteerType{get;set}
公共整数金额{get;set}
}
List userSteering=新列表
{
//初始化您的列表
};
//将该列表传递给构造函数。
在你的闲散课上:

private List<Steering> steeringValues;

public IdleSteering(List<Steering> userSteering)
{
    steeringValues = userSteering;
}

//we can now use LINQ to find any particular steering value.
int braking = steeringValues.SingleOrDefault(x=>x.SteerType==Random).Amount;
私有列表steeringValues;
公共怠速(列表用户转向)
{
steeringValues=userSteering;
}
//我们现在可以使用LINQ查找任何特定的转向值。
int braking=steeringValues.SingleOrDefault(x=>x.SteeringType==Random).Amount;

在所有方法之间传递并使用该集合。

最明显的解决方案是在参数中查找模式。我看到的是,
SteerType
和表示速度的
int
的组合。然后,您可以多次使用此组合,每个组合一次用于几个不同的状态

有鉴于此,您可以将这两件事合并到一个类中:

public class SteerSettings
{
    public SteerType Type { get; private set; }
    public int Interval { get; private set; }

    public SteerSettings(SteerType type, int interval)
    {
        Type = type;
        Interval = interval;
    }
}
然后将构造函数更改为如下所示:

public IdleSteering(SteerSettings rotationOn, SteerSettings collision, 
                    SteerSettings break,  SteerSettings breakTime, 
                    SteerSettings rotationOnBreak, SteerSettings rangeFromSpawn, 
                    SteerSettings speed)
    {
        ...
    }
一种更积极的方法是采用这种方法,创建一个表示各种状态的新枚举,并在
字典中使用它来指定每个状态的各种设置

public enum SteerState
{
    RotationOn,
    Collision,
    Break,
    BreakTime,
    RotationOnBreak,
    RangeFromSpawn,
    Speed
}

public IdleSteering(IDictionary<SteerState, SteerSettings> settings)
{
    ...
}
公共枚举状态
{
旋转,
碰撞
打破
休息时间,
旋转断裂,
从产卵开始,
速度
}
公共闲置(IDictionary设置)
{
...
}

最明显的解决方案是在参数中查找模式。我看到的是,
SteerType
和表示速度的
int
的组合。然后,您可以多次使用此组合,每个组合一次用于几个不同的状态

有鉴于此,您可以将这两件事合并到一个类中:

public class SteerSettings
{
    public SteerType Type { get; private set; }
    public int Interval { get; private set; }

    public SteerSettings(SteerType type, int interval)
    {
        Type = type;
        Interval = interval;
    }
}
然后将构造函数更改为如下所示:

public IdleSteering(SteerSettings rotationOn, SteerSettings collision, 
                    SteerSettings break,  SteerSettings breakTime, 
                    SteerSettings rotationOnBreak, SteerSettings rangeFromSpawn, 
                    SteerSettings speed)
    {
        ...
    }
一种更积极的方法是采用这种方法,创建一个表示各种状态的新枚举,并在
字典中使用它来指定每个状态的各种设置

public enum SteerState
{
    RotationOn,
    Collision,
    Break,
    BreakTime,
    RotationOnBreak,
    RangeFromSpawn,
    Speed
}

public IdleSteering(IDictionary<SteerState, SteerSettings> settings)
{
    ...
}
公共枚举状态
{
旋转,
碰撞
打破
休息时间,
旋转断裂,
从产卵开始,
速度
}
公共闲置(IDictionary设置)
{
...
}

看起来您有一个可能不确定长度的集合,由不同的参数组成

为什么不用字典来做呢,就像这样:

public IdleSteering(IDictionary<SteerType,int> steerSettings)
公共空闲设置(IDictionary设置)
然后通过字典键设置并获取一个值


看起来您有一个可能不确定长度的集合,由不同的参数组成

为什么不用字典来做呢,就像这样:

public IdleSteering(IDictionary<SteerType,int> steerSettings)
公共空闲设置(IDictionary设置)
然后通过字典键设置并获取一个值


我将使用SteerType和RotationValue(以及您的getter,如果需要,则为virtual)进行另一次旋转,并将在构造函数中使用如下默认参数(.NET 4.0要求):

那么你只要打电话:

var idleSteering = new IdleSteering();

当然,如果属性可以设置为默认值…

我会使用SteerType和RotationValue(如果需要,还有您的getter,virtual)进行另一次旋转,并在构造函数中设置如下默认参数(.NET 4.0要求):

那么你只要打电话:

var idleSteering = new IdleSteering();

当然,如果属性可以设置为默认值…

这肯定会对构造函数本身起作用,但仍然意味着我必须为添加的每个新参数复制粘贴和编辑第二段代码。所以这只是部分回答了我的问题。@Taelia-有几种方法可以解决这个问题。为每一对学生举办一次培训班会有所帮助。传递这些信息的列表可以是一种选择。如果你有不同的行为,你应该考虑继承。