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

本文关键字:参数 有效 方法 构造函数 | 更新日期: 2023-09-27 18:13:18

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

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

有大量参数的构造函数是最好的方法吗?还是有我不知道的更好的办法?如有任何建议,不胜感激。

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

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

你可以创建一个定义游戏角色的调用。让用户填充这个类,并将它作为参数传递给你的类。

像这样,

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

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

如果属性有公共setter,你可以使用对象初始化语法,例如:

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

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

这完全取决于这些参数是什么…但一般来说,拥有庞大的参数列表并不是一个好主意。这是因为它在参数是什么的问题上造成了混淆。一个例外是,当你有一个可变长度的参数列表时,它接受键/值对,允许你以未定义的顺序传递数据。

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

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

您有几个选择:

如果所有的值都是必需的:

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

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

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

您可以创建一个返回类实例的方法。

例如:

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

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

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