Будете ли вы использовать регионы в длинных объявлениях switch / enum? - PullRequest
6 голосов
/ 26 июня 2009

Я недавно обнаружил, что мне нужно (да, нужно) определять нелепо длинные switch заявления и enum объявления в коде C #, но мне интересно, что люди считают лучшим способом разбить их на логические подразделы , В моей ситуации как значения enum, так и case (которые основаны на значениях enum) имеют довольно четкие группировки, но я немного не уверен, как это отразить в коде.

Обратите внимание, что в моем коде у меня примерно 5 групп от 10 до 30 перечисляемых значений / падежей в каждой.

Три смутно разумных варианта, которые я могу предусмотреть:

  1. Определить #region блоков вокруг всех логических групп значений case / enum в объявлении (необязательно разделенных пустыми строками).
  2. Прокомментируйте каждую группу своим именем, с пустой строкой перед каждым комментарием к названию группы.
  3. Ничего не делать - просто оставьте switch / enum в виде огромного списка падежей / значений.

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

Примечание 1: Эта ситуация, где у меня потенциально может быть очень длинное объявление enum со значениями 50/100 +, к сожалению, неизбежна (и аналогично переключателю), так как я пытаюсь написать лексер ( токенизатор), и, таким образом, это представляется наиболее разумным подходом по нескольким причинам.

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

Ответы [ 6 ]

3 голосов
/ 26 июня 2009

Вы также можете иметь словарь <[your_enum_type], Action> (или Func вместо Action) или что-то в этом роде (учитывая, что ваши функции имеют похожую подпись). Тогда вы могли бы вместо использования переключателя вместо:

        switch (item)
        {
            case Enum1: func1(par1, par2)
                break;
            case Enum2: func2(par1, par2)
                break;
        }

у вас может быть что-то вроде:

public class MyClass
{
    Dictionary<int, Action<int, int>> myDictionary;
    //These could have only static methods also
    Group1Object myObject1;
    Group2Object myObject2;

    public MyClass()
    {
        //Again, you wouldn't have to initialize if the functions in them were static
        myObject1 = new Group1Object();
        myObject2 = new Group2Object();
        BuildMyDictionary();
    }

    private Dictionary<int, Action<int, int>> BuildMyDictionary()
    {
        InsertGroup1Functions();
        InsertGroup2Functions();
        //...
    }

    private void InsertGroup2Functions()
    {
        myDictionary.Add(1, group2.AnAction2);
        myDictionary.Add(2, group2.AnotherAction2);
    }

    private void InsertGroup1Functions()
    {
        myDictionary.Add(3, group1.AnAction1);
        myDictionary.Add(4, group1.AnotherAction1);
    }


    public void DoStuff()
    {
        int t = 3; //Get it from wherever
        //instead of switch
        myDictionary[t](arg1, arg2);
    }
}
3 голосов
/ 26 июня 2009

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

Они существуют по какой-то причине, используйте их в своих интересах.

1 голос
/ 26 июня 2009

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

1 голос
/ 26 июня 2009

Я бы оставил это как огромный список дел / значений.

0 голосов
/ 26 июня 2009

Вот хороший ярлык для людей, которые используют регионы.

Я переключался между Eclipse и Visual Studio, когда пытался перейти на полный экран в VS, нажимая

Ctrl-M-M

и о чудо, регион закрыт и расширен!

0 голосов
/ 26 июня 2009

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

Очень мало случаев, когда вам действительно нужно использовать enum вместо объекта, и никто не любит длинные операторы switch.

...