【发布时间】:2011-11-26 08:46:49
【问题描述】:
考虑以下控件(为简洁起见):
public partial class ConfigurationManagerControl : UserControl
{
public Func<string, bool> CanEdit { get; set;}
public Func<string, bool> CanDelete { get; set; }
public Dictionary<string, string> Settings
{
get { return InnerSettings; }
set
{
InnerSettings = value;
BindData();
}
}
private Dictionary<string, string> InnerSettings;
private void OnListIndexChanged(object sender, EventArgs e)
{
this.EditButton.Enabled = false;
this.DeleteButton.Enabled = false;
var indices = this.List.SelectedIndices;
if (indices.Count != 1)
{
return;
}
var index = indices[0];
var item = this.List.Items[index];
if (this.CanEdit != null)
{
this.EditButton.Enabled = this.CanEdit(item.Text);
}
if (this.CanDelete != null)
{
this.DeleteButton.Enabled = this.CanDelete(item.Text);
}
}
}
此控件还有更多功能,但只要说它允许用户添加、编辑和删除 Dictionary
public class SetupWizard : Form
{
public SetupWizard()
{
InitializeComponent();
this.SettingManager.CanEdit = CanEditSetting;
this.SettingManager.CanDelete = CanDeleteSetting;
}
private static bool CanEditSetting(string item)
{
var lockedSettings = new[] { "LicenseHash", "ProductHash" };
return !lockedSettings.Contains(item.ToLower());
}
private static bool CanDeleteSetting(string item)
{
var lockedSettings = new[] {
"LicenseHash",
"ProductHash",
"UserName",
"CompanyName"
};
return !lockedSettings.Contains(item.ToLower());
}
}
我发现这种设计既令人满意又令人担忧。一方面,它似乎使用最简单的有效解决方案来解决问题(它肯定很好地分离了关注点)。另一方面,我有一个令人烦恼的问题,即我不正确地使用了委托,应该使用一个事件,而不是(即使我确实 不需要 需要多个侦听器,并且只需要调用者告诉我是否该项目是可编辑的)。
然后,另一方面,有可能存在一种我什至没有考虑过的完全不同的设计,它可能会以一种非常优越的方式解决问题。
所以。这种设计在技术上是否正确、可维护和灵活?还是我应该做得更好?
【问题讨论】:
-
似乎这个问题更适合 codereview.se。
-
您应该看看(但不使用)WPF 中的 RoutedCommands。如果您使用的是 WPF,那就另当别论了……
-
遗憾的是,还没有在 WPF 上。仍在经典的 WinForms 上。
标签: c# delegates software-design