将大量参数传递到配置对话框的最佳方法
我遇到的情况是,我有一个主窗体,它弹出一个高级配置窗体,其中只有六个匹配的复选框和组合框可以选择一些高级选项(启用/禁用复选框,组合选择一个高级选项)。媒体(如果启用)。
如果我只是将复选框和组合框的各个设置传递给对话框的构造函数,则显然有十几个参数,这似乎有点多余。
我的另一个明显选择是,因为在主表单中这些设置与所有其他主表单设置一起存储在大型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"更改为私有或者受保护,并根据需要具有访问器功能。