Есть 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("Клеим глаза");
}
}
|
| |