我有一个情况,我有一个主窗体,弹出一个高级配置表单,只有六个匹配的复选框和组合框,以选择一些高级选项(复选框启用/禁用,组合如果启用则选择媒体。)
如果我只是将检查和组合框的各个设置传递给对话框的构造函数,这显然是十几个参数,这看起来有点过分。
我的另一个显而易见的选择是,因为在主窗体中这些设置存储在一个大的IDictionary中,其中包含所有其他主要的表单设置,我可以直接传入这个字典,然后使用更新的值将其取回,但我的理解是这不是一个非常好的编码实践。
我是否错过了一个有效且良好的编码实践的好方法?
(这个特殊的代码在C#中,虽然我觉得一般的解决方案也适用于其他语言)
答案 0 :(得分:6)
我个人会创建一个载体对象来存储值。然后你得到了很好的intellisense,对它的改变将非常简单。它也比参数值的字典查找更快。当然,你得到了类型安全。 :)
答案 1 :(得分:1)
你可以选择Rob的解决方案;这是发展最漂亮的。您的“运营商对象”可以包含整个IDictionary,并具有类型属性以帮助智能感知。属性可以更新IDictionary。完成后,您可以传回运营商对象并直接从中获取IDictionary。
例如,如果你的字典有键/值对“FirstEnabled”/ boolean,你可以这样做:
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”更改为private或protected,并根据需要使用访问者功能。
答案 2 :(得分:0)
这样的事情应该是好的:
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"];
}
答案 3 :(得分:0)
我同意Rob Cooper。创建一个表示您的配置的类,并将其传递给表单的构造函数。这也允许您在新的“config”类上定义方法,如“saveSettings”,“LoadSettings”等。这反过来应该使代码更易于维护。
作为一种快速而又脏的选择,如果您将这些文件保存到某个文件中,只需传递该文件的名称,并在运行时读取该表单。
第一个选择真的是要走的路,IMO。