Делегаты как свойства: плохая идея?

Рассмотрим следующий элемент управления (вырезан для краткости):

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());
    }
}

Я считаю, что этот дизайн одновременно и удовлетворителен, и вызывает беспокойство. С одной стороны, кажется, что проблема решается с помощью самого простого из работающих решений (оно, безусловно, хорошо разделяет проблемы). С другой стороны, меня беспокоит то, что я использую делегаты неправильно и вместо этого должен использовать событие (хотя мне , а не нужно несколько слушателей, и мне нужен только вызывающий, чтобы сообщить мне, если элемент доступен для редактирования).

А с другой стороны, есть шанс, что есть совершенно другой дизайн, который, как я даже не думал, мог бы решить проблему намного лучше.

Итак. Является ли эта конструкция технически правильной, удобной в обслуживании и гибкой? Или мне стоит заняться чем-то лучше?

15
задан Mike Hofer 27 September 2011 в 20:10
поделиться