将许多控件作为参数传递给方法的最佳方法是什么?

时间:2018-12-26 22:03:33

标签: c#

我有一个Windows窗体,其中包含许多控件,这些控件根据一天(星期一,星期二等)分为不同的组,并且功能取决于当天的控件。我想找到一种更好的方式来构造代码,因为现在它看起来像意大利面条。

当前,我的代码在技术上可以正常工作,但是很混乱。它太长了,当我需要编辑某些功能时,我必须在7天的不同时间内对其进行编辑,然后查找/替换控件名称和内容。

在一个经验丰富的同事的帮助下,他建议使用参数(duh),我找到了一种简化它的方法。我还没有将其应用到我的主代码中,但是已经在更简单的测试环境中对其进行了试用。

现在的问题是,我希望以某种方式对它们进行分组的参数数量过多。

我已经研究了GroupBox控件,但是它似乎并没有实现我希望的那样。

这是我正在使用的简化代码示例。 在我的实际代码中,涉及到很多控件,因此还有很多参数。

private void validate(DateTimePicker start, DateTimePicker end, DateTimePicker lunch, Label day)
{
    if ((lunch.Value < start.Value || lunch.Value >= end.Value))
    {
        day.Visible = true;
    }
    if ((lunch.Value >= start.Value && lunch.Value < end.Value))
    {
        day.Visible = false;
    }
}

我觉得我应该使用数组对它们进行分组?谁能确认?谢谢。

TL; DR:如何对要传递给函数的许多参数进行分组?

1 个答案:

答案 0 :(得分:1)

我不确定您与我们共享的小范围范围是否足以给出有意义的答案;但是我不确定与我们分享大部分代码确实有帮助。

无论如何,有了您提供给我们的少量信息,我可以想到一些建议:

1。创建自定义控件

如果您说您有一组控件在一周中的每一天重复一次,并且每组控件执行相同的逻辑,那么最好创建一个包含每天所需的所有控件的自定义控件,以及每组控件中的逻辑。添加方法,函数和事件以控制其行为以及与表单其余部分的交互。然后,只需根据需要放置该控件的多个实例,然后让该控件本身即可。

2。不要将控件作为参数传递,而要传递其值

将控件作为参数传递给代码几乎没有价值,增加了复杂性,加强了耦合,甚至可能被视为代码异味。而是创建将值作为参数接收的方法和函数,并使用控件的值调用它们。这样,您甚至可以创建一个包含所有所需值的POCO并将其作为参数接收-只需确保每个POCO与逻辑设计相关,而不与函数相关(即,不要创建一个对于每个函数;创建4或5,可以包含所有必需的值,并在每个函数中接收所需的数量)。这也是迈向“解耦”方向的一步,使您最终可以将代码分层。

3。使用返回值代替参考参数。 增加您的方法接收的参数数量的一件事是,您还会收到其状态将被其修改的对象。您可以返回一个值并将其分配给目标控件,这既减少了参数的数量,又增加了函数的实用性。

请考虑以下几点,并以您的示例代替:

private void validate(DateTimePicker start, DateTimePicker end, DateTimePicker lunch, Label day)
{
    if ((lunch.Value < start.Value || lunch.Value >= end.Value))
    {
        day.Visible = true;
    }
    if ((lunch.Value >= start.Value && lunch.Value < end.Value))
    {
        day.Visible = false;
    }
}

您可能有这个:

private bool validate(DateTime start, DateTime end, DateTime lunch)
{
    return lunch < start || lunch > end;
}

public bool validateControl()
{
    //executes all validations
    this.lblDay.Visible = validate(dtpStart.Value, dtpEnd.Value, dtpLunch.Value);
}