将大量参数传递给构造函数的有效方法

时间:2013-05-13 21:51:21

标签: c#

我正在研究一个项目,并且我有一个对象,在实例化时会传递大量值(20+)。我知道我可以创建一个能够接受所有值的构造函数,但我正在寻找一种更清晰/更有效的方法来实现这一点。

只是为了透视,对象是游戏中的角色,经常创建新的实例。分配的值是随机生成的属性。

具有大量参数的构造函数是最好的方法吗?或者有更好的方法来做我不知道的事情吗?任何建议都将不胜感激。

编辑:当新游戏开始时,创建List<Character>并且for循环创建10个角色实例并将它们添加到列表中。

6 个答案:

答案 0 :(得分:13)

您可以创建定义游戏角色的通话。让用户填充该类并将其作为参数传递给您的类。

这样的事,

public class CharecterInfo
{ 
       public string Name {get;set;}
       public int Power {get;set;}
       public int Health{get;set;}
}

public class Charecter
{ 
     public Charecter(CharecterInfo charecterInfo)
     {
        //import values
     }
}

我会避免使用公共属性,因为你的类可以在没有正确初始化(处于错误状态)时使用,这是构造函数的工作。你应该使用构造函数并在允许用户继续之前验证输入。

答案 1 :(得分:2)

如果属性具有公共设置器,则可以使用对象initialization syntax,例如:

Character c = new FooCharacter() {
    Name = "Ugly Monster",
    HP = 10000,
    ....,
};

编辑:正如评论中所指出的,这假定您的构造函数(空或具有最小参数)将使用有效数据初始化所有必需属性。初始化语法只是语法糖,它在构造函数初始化对象后设置任何指定的属性。

答案 2 :(得分:1)

这完全取决于这些论点是什么......但一般来说,拥有庞大的参数列表并不是一个好主意。这是因为它产生的混淆是什么参数。例外情况是你有一个带有键/值对的可变长度参数列表,允许你以未定义的顺序传递数据。

另一种方法是创建另一个代表所有参数的类。你可以创建一个这样的实例,设置相关的字段并传入它。为了扩展这个想法,你可以将该类分解为几个类,然后提供一些构造函数,这些构造函数采用不同的组合。

这种方法的有用之处在于您可以为任何参数设置默认值。通常,如果要为参数列表中的某些内容指定值,但对其余部分使用默认值,则必须填写其间的所有默认值。使用此方法,您可以使用除要指定的值之外的所有默认值。

答案 3 :(得分:1)

您有几种选择:

如果需要所有值:

  • 坚持使用大量参数
  • 创建一个新类,其中包含所有这些项目作为属性

如果不是所有值都是必需的,您可以使用Builder-pattern:

此链接详细描述了模式:http://cdmckay.org/blog/2009/07/03/joshua-blochs-builder-pattern-in-csharp/

答案 4 :(得分:1)

一种可能性在于OOAD本身。角色属性听起来像一个足够大的关注点,是你的角色类与之合作的独特类的责任。

对您的域名进行快速CRC分析可能有助于确定一个或多个新区分的职责&amp;目前缺少的相应类型。

答案 5 :(得分:1)

您可以创建一个返回类实例的方法。也许甚至在那个班级本身。

类似的东西:

public class Character
{
    public string Name;
    public int Level;
    static Random random = new Random();

    public static Character CreateNew()
    {
        Character newOne = new Character();
        newOne.Level = random.Next(1, 5);
        newOne.Name = (random.Next(1, 2) == 1) ? "Me" : "You";
        return newOne;
    }
}