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