Рефакторинг оператора переключения для данных на разные типы данных - PullRequest
2 голосов
/ 29 ноября 2010

Моя миссия заключается в рефакторинге оператора switch, который был написан плохо (он вызывает всплеск цикломатической сложности).Короче говоря, есть класс, который анализирует файл на различные значения.

class foo
{
    //a sampling of the fields.  Each have their appropriate property
    private string _name;
    private short _location;
    private int _lineNumber;
    private List<string> _siblings;

    internal foo (StreamReader reader)
    {
        _siblings = new List<string>()
        while (!reader.EndofFile)
        {
            switch (reader.ReadLine())
            {
               case "Name":
                  _name = reader.ReadLine();
                  break;
               case "Location":
                  _location = short.Parse(reader.ReadLine());
                  break;
               case "Line Number":
                  _lineNumber = int.Parse(reader.ReadLine());
                  break;
               case "Brother":
               case "Sister":
                  _siblings.Add(reader.ReadLine());
                  break;
               //etc
            }
        }
    }
    //Other methods and such
}

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

Я думал оиспользуя Dictionary<String, TValue>, как описано Джоном Сонмезом , но что тогда будет TValue?

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

4 голосов
/ 29 ноября 2010

Прежде всего, reader.ReadLine() на самом деле не является частью оператора switch, поэтому я бы посоветовал вам просто прочитать строки две на две и перейти к другому классу для обработки.(кажется, первая строка определяет, что это такое, а вторая имеет значение).

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

 Dictionary<string, Action<string>> dic = new Dictionary<string, Action<string>>();
 dic.Add("Father", ((x)=> // somthing);
 dic.Add("Brother", ((x)=> // somthing);
 dic.Add("Sister", ((x)=> // somthing);
0 голосов
/ 29 ноября 2010

Два варианта.

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

Надеюсь, что это поможет или, по крайней мере, укажет вам правильное направление:

...