将大量参数传递到配置对话框的最佳方法

时间:2020-03-05 18:46:37  来源:igfitidea点击:

我遇到的情况是,我有一个主窗体,它弹出一个高级配置窗体,其中只有六个匹配的复选框和组合框可以选择一些高级选项(启用/禁用复选框,组合选择一个高级选项)。媒体(如果启用)。

如果我只是将复选框和组合框的各个设置传递给对话框的构造函数,则显然有十几个参数,这似乎有点多余。

我的另一个明显选择是,因为在主表单中这些设置与所有其他主表单设置一起存储在大型IDictionary中,所以我可以传入此字典,然后使用更新后的值取回它,但是我的理解是真的不是很好的编码实践。

我是否错过了一种既高效又良好的编码实践的好方法?

(虽然我觉得一般的解决方案也适用于其他语言,但是该特定代码是用C#编写的)

解决方案

回答

我个人将创建一个载体对象来存储值。然后,我们将获得很好的智能感知,并且对其进行更改将非常简单。对于参数值,这也将比字典查找更快。当然,我们会获得类型安全性。 :)

回答

像这样的东西应该很好:

MyConfigurationDialog dialog = new MyConfigurationDialog();

//Copy the dictionary so that the dialog can't mess with our settings
dialog.Settings = new Dictionary(existingSettings);

if(DialogResult.OK == dialog.Show()) {
  //grab the settings that the dialog may have changed
  existingSettings["setting1"] = dialog.Settings["setting1"];
  existingSettings["setting2"] = dialog.Settings["setting2"];
}

回答

我同意罗伯·库珀(Rob Cooper)的观点。创建一个代表配置的类,然后将其传递到表单的构造函数中。这也将允许我们在新的" config"类上定义方法,例如" saveSettings"," LoadSettings"等。这反过来又应该使代码总体上更具可维护性。

作为一种快捷的替代方法,如果要将它们保存到某个文件中,则只需传递文件名,然后让表单在运行时读取该文件即可。

IMO确实是第一个选择。

回答

我们可以采用Rob的解决方案;这是最漂亮的发展。"载体对象"可能包含整个IDictionary,并具有有助于智能感知的类型化属性。这些属性可以更新IDictionary。完成后,我们可以将载体对象传回并直接从中获取IDictionary。

例如,如果字典具有键/值对" FirstEnabled" /布尔值,则可以执行以下操作:

class ContainerObject
{
    public IDictionary<object, object> _dict;
    public ContainerObject(IDictionary<object, object> dict)
    {
        _dict = dict;
    }

    public bool FirstEnabled
    {
        get { return (bool) _dict["FirstEnabled"]; }
        set { _dict["FirstEnabled"] = value; }
    }
}

我们可以将成员" _dict"更改为私有或者受保护,并根据需要具有访问器功能。