优化多个参数传递给类构造函数的过程

本文关键字:构造函数 过程 参数传递 优化 | 更新日期: 2023-09-27 17:52:35

我正在用c#编写一个桌面应用程序。Net和SQL server。我有几个带有几个参数的类构造函数,每次我都要将它们传递给这些参数。下面是一个例子:

 Classes.Prices prices = new Classes.Prices  
 (comboBox1.SelectedValue.ToString(),
  Convert.ToInt32(txtPrice.Text), 
  Convert.ToInt32(txtCarbohydrate.Text),   
  Convert.ToInt32(txtProtein.Text),   
  Convert.ToInt32(txtFat.Text), 
  Convert.ToInt32(txtHumidity.Text), 
  Convert.ToInt32(txtminerals.Text));

是否有办法克服这一点,并防止为转换和传递多个参数而编写大量代码

优化多个参数传递给类构造函数的过程

你不应该在一个方法中使用超过2到3个参数。

定义一个名为PriceHolder的类

public class PriceHolder
{
    public string FirstValue { get; set; }
    public string Price { get; set; }
    public string Carbohydrate { get; set; }
    public string Protein { get; set; }
    public string Fat { get; set; }
    public string Humidity { get; set; }
    public string Minerals { get; set; }
}

然后,构造函数必须接受PriceHolder

的对象

:

public Prices(PriceHolder hold)
{
 // access the values by hold.Fat, hold.Minerals etc
}

这个方法使重构代码更容易,或者如果你想添加一些更多的属性。

同样,你的程序员同事也能很容易地理解它。可读性很重要!

也许这会有帮助。设Price构造器如下:

public Prices(string s, int[] values)
{
    ...
}

让我们以如下形式声明这个静态方法:

private static int[] ParseInts(params TextBox[] textBoxes)
{
    return Array.ConvertAll(textBoxes, tb => int.Parse(tb.Text));
}

构造函数调用变成:

Prices prices = new Prices(comboBox1.SelectedValue.ToString(), 
    ParseInts(txtPrice, txtCarbohydrate, txtProtein, txtFat, txtHumidity, txtminerals));

编辑。您还可以将一组文本框存储为数组,而不是每次都动态地创建它:

private readonly TextBox[] textBoxes = new[] { txtPrice, txtCarbohydrate, txtProtein, txtFat, txtHumidity, txtminerals };
Prices prices = new Prices(comboBox1.SelectedValue.ToString(), ParseInts(textBoxes));

有。使用数据绑定将表单绑定到对象。数据绑定在两个方向上自动转换,即从字符串转换为数字和日期。

除了具有自动转换的优点之外,还可以将业务逻辑从表单中分离出来。例如,您可以将任何逻辑应用于称为Prices.Price的属性(如果逻辑在Prices类中,则仅应用于Price),而不是将其应用于像Convert.ToInt32(txtPrice.Text)这样的结构,这使得它更容易理解和维护代码。

为了使用数据绑定,为类添加一个公共默认构造函数(不带参数的构造函数),并为每个值添加一个公共属性。

public class Prices
{
    public Prices () 
    { }
    public Prices (decimal price, int carbohydrate, ...) 
    { ... }
    public decimal Price { get; set; }
    public int Carbohydrate { get; set; }
    ...
}

:

Windows窗体的数据绑定(基于developerfusion)

.NET windows窗体中的数据绑定概念(在CodeProject上)


解决问题的另一种完全不同的方法是将数据规范化。引入Parameter类,并将参数存储在Prices类的字典或列表中。这使您能够循环处理参数,而不必单独对每个参数进行编程。它还具有用最少的代码进行扩展的优点。

public class Parameter
{
    public string Name { get; set; }
    public int Value { get; set; }
}
public class Prices
{
    public Prices (IEnumerable<Parameter> parameters) 
    { 
        ... 
    }
}