Рассмотрим следующий элемент управления (вырезан для краткости):
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);
}
}
}
В этом элементе управления есть еще кое-что, но достаточно сказать, что он позволяет пользователю добавлять, редактировать и удалять записи в Словаре <строка, строка>. Чтобы определить, следует ли разрешать пользователю редактировать или удалять записи, он использует метод делегата , свойства , CanDelete и CanEdit, которые предоставляются формой или элементом управления. который размещает его:
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());
}
}
Я считаю, что этот дизайн одновременно и удовлетворителен, и вызывает беспокойство. С одной стороны, кажется, что проблема решается с помощью самого простого из работающих решений (оно, безусловно, хорошо разделяет проблемы). С другой стороны, меня беспокоит то, что я использую делегаты неправильно и вместо этого должен использовать событие (хотя мне , а не нужно несколько слушателей, и мне нужен только вызывающий, чтобы сообщить мне, если элемент доступен для редактирования).
А с другой стороны, есть шанс, что есть совершенно другой дизайн, который, как я даже не думал, мог бы решить проблему намного лучше.
Итак. Является ли эта конструкция технически правильной, удобной в обслуживании и гибкой? Или мне стоит заняться чем-то лучше?