Лучший способ передать большое количество аргументов в диалог конфигурации - PullRequest
2 голосов
/ 02 сентября 2008

У меня есть ситуация, когда у меня есть основная форма, которая выскакивает расширенную форму конфигурации, которая имеет всего полдюжины соответствующих флажков и комбинированных полей для выбора некоторых расширенных параметров (флажки для включения / выключения, комбо выбрать носитель, если он включен).

Если я просто передам отдельные настройки для флажков и полей со списком в конструктор для диалогового окна, это, очевидно, дюжина аргументов, что кажется несколько чрезмерным.

Мой другой очевидный вариант - это то, что в основной форме эти настройки хранятся в большом IDictionary со всеми остальными настройками основной формы. Я мог бы просто передать этот словарь и извлечь его позже с обновленными значениями, но я понимаю, что что это не очень хорошая практика кодирования.

Мне не хватает хорошего способа сделать это, который является эффективным и хорошим методом кодирования?

(этот конкретный код написан на C #, хотя я чувствую, что общее решение применимо и к другим языкам)

Ответы [ 4 ]

6 голосов
/ 02 сентября 2008

Я бы лично создал объект-носитель для хранения значений. Затем вы получите хороший intellisense для него, и изменения в нем будут довольно простыми. Это также будет быстрее, чем поиск по словарю для значений параметров. И, конечно, вы получаете безопасность типов. :)

1 голос
/ 02 сентября 2008

Вы могли бы пойти с решением Роба; это самый красивый для развития. Ваш «объект-носитель» может содержать весь IDictionary и иметь типизированные свойства, чтобы помочь intellisense. Свойства могут обновить IDictionary. Когда вы закончите, вы можете передать объект-носитель обратно и извлечь из него IDictionary.

Например, если ваш словарь имеет пару ключ / значение "FirstEnabled" / логическое значение, вы можете сделать это:

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" на частный или защищенный и иметь функцию доступа, если хотите.

0 голосов
/ 02 сентября 2008

Я согласен с Робом Купером. Создайте класс для представления вашей конфигурации и передайте его в конструктор вашей формы. Это также позволит вам определять методы для вашего нового класса «config», такие как «saveSettings», «LoadSettings» и т. Д. Это, в свою очередь, должно в целом сделать код более понятным.

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

Первый вариант - это путь, IMO.

0 голосов
/ 02 сентября 2008

Примерно так должно быть хорошо:

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"];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...