2

我正在做一个项目,我有一个对象,在实例化它时,将有大量的值(20+)传递给它。我知道我可以创建一个可以接受所有值的构造函数,但我正在寻找一种更清洁/更有效的方法来做到这一点。

从这个角度来看,对象是游戏中的一个角色,它的新实例经常被创建。分配的值是随机生成的属性。

具有大量参数的构造函数是最好的方法吗?或者有没有更好的方法来做到这一点,我不知道?任何建议将不胜感激。

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

4

6 回答 6

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

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

于 2013-05-13T21:56:54.487 回答
2

如果属性有公共设置器,您可以使用对象初始化语法,例如:

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

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

于 2013-05-13T21:57:54.450 回答
1

一种可能性在于 OOAD 本身。角色属性听起来像是一个足够大的关注点,可以成为与角色类协作的不同类的责任。

对您的域进行快速CRC分析可能有助于识别当前缺少的一个或多个新区分的职责和相应类型。

于 2013-05-13T21:59:20.073 回答
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;
    }
}
于 2013-05-13T22:14:41.967 回答
1

这完全取决于这些参数是什么......但一般来说,拥有庞大的参数列表并不是一个好主意。这是因为它对哪个参数是什么造成了混淆。一个例外是您有一个可变长度的参数列表,该列表采用键/值对,允许您以未定义的顺序传递数据。

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

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

于 2013-05-13T21:58:07.363 回答
1

你有几个选择:

如果需要所有值:

  • 坚持使用大量参数
  • 创建一个具有所有这些项目作为属性的新类

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

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

于 2013-05-13T21:58:11.587 回答