优化多个参数传递给类构造函数的过程
本文关键字:构造函数 过程 参数传递 优化 | 更新日期: 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)
{
...
}
}