Дублирующиеся значения ключа в словаре объекта и неправильный дизайн - PullRequest
0 голосов
/ 05 марта 2011

Я хотел сделать что-то «динамическое» с объектом словаря и предоставил аргументы командной строки.Аргументы командной строки являются логическими, и я мог бы затем вызывать методы, если любой из них был истинным.Итак…

public class CommandLineArguments
{
    public bool AddSection1 { get; set; }
    public bool AddSection2 { get; set; }
    public bool Addsection3 { get; set; }        
}

class RunSomeActions
{
    private Dictionary<bool, Action> methodList = new Dictionary<bool, Action>();

    public RunSomeActions()
    {
        // create the switches as if from a command line
        CommandLineArguments parameters = new CommandLineArguments();
        parameters.AddSection1 = true;
        parameters.AddSection2 = false;
        parameters.Addsection3 = true;

        // setup the methods for the switches
        methodList.Add(parameters.AddSection1, this.Section1);
        methodList.Add(parameters.AddSection2, this.Section2);
        methodList.Add(parameters.Addsection3, this.Section3);

        foreach (var entry in methodList)
        {
            // if the switch is on
            // call the method
            if (entry.Key)
                methodList[entry.Key]();
        }


    }

    private void Section1()
    { 
        // add specific entries into a file
    }

    private void Section2()
    { 
        // perform analysis on a file
    }

    private void Section3()
    { 
        // delete everything and start again
    }

}

Это прекрасно работает, если у вас есть только два значения true и false, так что на самом деле это не очень хорошо.Что мне понравилось в этом подходе, так это то, что мне не нужно было анализировать аргументы вручную, а затем создавать список действий.Есть ли способ, которым я могу спасти этот дизайн?

Ответы [ 2 ]

3 голосов
/ 05 марта 2011

Поскольку вы на самом деле не используете словарь для поиска, а просто для хранения и итерации, вместо использования Dictionary<K,V>, вы можете просто использовать List<KeyValuePair<K,V>>.

Основное отличие с точки зрения кода будет меняться. Добавить к:

methodList.Add(new KeyValuePair<bool, Action>(parameters.AddSection1, this.Section1));

Затем при использовании переключитесь на:

foreach (var entry in methodList)
{
    // if the switch is on
    // call the method
    if (entry.Key)
        entry.Value(); // Execute "value" directly
}

При этом вы можете сделать еще один шаг, потенциально, и просто сохранить List<Action> напрямую. Добавляйте только действия в список, где условие выполняется, затем выполняйте их все.

0 голосов
/ 05 марта 2011

Я бы предложил создать структуру.

struct MethodListItem
{
    bool IsActive;
    Action Action;
}

Затем объявить methodList как (неожиданно) a List<MethodListItem> и добавить вот так:

methodList.Add(new MethodListItem { IsActive = parameters.AddSection1, Action = this.Section1});
methodList.Add(new MethodListItem { IsActive = parameters.AddSection2, Action = this.Section2});
methodList.Add(new MethodListItem { IsActive = parameters.Addsection3, Action = this.Section3});

Циклтело становится более читабельным:

foreach (var entry in methodList)
{
    // if the switch is on
    // call the method
    if (entry.IsActive) entry.Action();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...