[Updated]Таблица из двух параметров - как лучше записать?
От: Shmj Ниоткуда  
Дата: 15.11.21 09:52
Оценка:
Есть 2 параметра (или даже больше) state1 и state2. В зависимости от значений state1 и state2 — нужно выполнять определенные действия или бездействия (а так же генерить исключения — если такая комбинация не возможна).

Можно использовать вложенные друг в друга switch/case. Если в каждом из state 3 возможных значения — то получится 3 switch и внутри каждого — еще по 3 штуки switch. Есть ли что более красивое?

Добавляю пример для ясности:

  Скрытый текст
using System;

namespace ConsoleApp36
{
    class Program
    {
        enum GradeOfMen
        {
            Black,
            Mandarin,
            Aryan
        }

        static void Main(string[] args)
        {
            TransformAMan(GradeOfMen.Mandarin, GradeOfMen.Black);
        }

        static void TransformAMan(GradeOfMen fromMan, GradeOfMen toMan)
        {
            switch (fromMan)
            {
                case GradeOfMen.Black:

                    switch (toMan)
                    {
                        case GradeOfMen.Black:

                            // do nothing

                            break;
                        case GradeOfMen.Mandarin:

                            Wash();
                            GlueEyes();

                            break;
                        case GradeOfMen.Aryan:

                            throw new InvalidOperationException(); // impossible

                        default:
                            throw new ArgumentOutOfRangeException(nameof(toMan), toMan, null);
                    }

                    break;
                case GradeOfMen.Mandarin:

                    switch (toMan)
                    {
                        case GradeOfMen.Black:

                            Soot();
                            Scare();

                            break;
                        case GradeOfMen.Mandarin:

                            // do nothing

                            break;
                        case GradeOfMen.Aryan:

                            throw new InvalidOperationException(); // impossible

                        default:
                            throw new ArgumentOutOfRangeException(nameof(toMan), toMan, null);
                    }

                    break;
                case GradeOfMen.Aryan:

                    switch (toMan)
                    {
                        case GradeOfMen.Black:
                            
                            Soot();

                            break;

                        case GradeOfMen.Mandarin:

                            GlueEyes();

                            break;

                        case GradeOfMen.Aryan:

                            // do nothing

                            break;
                        default:
                            throw new ArgumentOutOfRangeException(nameof(toMan), toMan, null);
                    }

                    break;
                default:
                    throw new ArgumentOutOfRangeException(nameof(fromMan), fromMan, null);
            }
        }

        static void Scare() => Console.WriteLine("Пугаем (глаза увеличиваются)");
        static void Wash() => Console.WriteLine("Отмываем");
        static void Soot() => Console.WriteLine("Посыпаем сажей");
        static void GlueEyes() => Console.WriteLine("Клеим глаза");
    }
}
Отредактировано 15.11.2021 18:24 Shmj . Предыдущая версия . Еще …
Отредактировано 15.11.2021 18:23 Shmj . Предыдущая версия .
Отредактировано 15.11.2021 10:40 Shmj . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.