Одно «неуклюжее» решение - использовать упрощенную версию шаблона проектирования Chain Of Responsibility . Фактически, этот шаблон был создан для того, чтобы справляться с ситуациями, точно такими, как Дэвид описал здесь.
код
В вашем случае вам просто нужно сопоставить строки с действиями. Вы можете определить базовый класс, который
выполняет итерацию по цепочке и выполняет заданное действие при обнаружении совпадения или перенаправляет ввод в следующую опцию.
abstract class Option
{
public void DoActivity(string input)
{
Match parse = m_regex.Match(input);
if (parse.Success)
Activity(input);
else if (m_nextOption != null)
m_nextOption.DoActivity(input);
else
Console.WriteLine("No activity for input \"{0}\"", input);
}
// Each option defines its own activity; override as necessary.
protected void Activity(string input)
{
Console.WriteLine(
"For input \"{0}\" --> do activity defined in {1} ...", input, this);
}
// The next option in the chain, or null.
protected Option m_nextOption;
// Regular expression that matches the input for this option.
protected Regex m_regex;
}
Затем создайте производные классы для столько вариантов, сколько вам нужно. Каждый определяет:
- регулярное выражение, соответствующее входам для обработки,
- действие, которое нужно выполнить для сопоставления входных данных (все используют метод базового класса в этом простом примере), и
- следующий вариант в цепочке, если он есть.
Что-то вроде:
internal class OptionOne : Option
{
public OptionOne()
{
m_nextOption = new OptionTwo(); // next option.
m_regex = new Regex(@"^Option One$", RegexOptions.Compiled);
}
}
internal class OptionTwo : Option
{
public OptionTwo()
{
m_nextOption = new OptionThree(); // next option.
m_regex = new Regex(@"^Option Two$", RegexOptions.Compiled);
}
}
internal class OptionThree : Option
{
public OptionThree()
{
m_nextOption = null; // no other options.
m_regex = new Regex(@"^Option Three$", RegexOptions.Compiled);
}
}
Использование
// Possible input strings.
string[] myStrings = { "Option One", "Option Two",
"Option Three", "Matches No Options" };
// Do each input's activity ...
Option options = new OptionOne();
foreach (var myString in myStrings)
{
options.DoActivity(myString);
}
выход
Для ввода «Вариант один» -> выполнить действие, определенное в StackOverflow.OptionOne ...
Для ввода «Вариант второй» -> выполнить действие, определенное в StackOverflow.OptionTwo ...
Для ввода «Вариант третий» -> выполнить действие, определенное в StackOverflow.OptionThree ...
Нет активности для ввода "Нет соответствий"
Еще одним преимуществом использования этого шаблона является то, что если вам необходимо добавить дополнительные параметры позже, вам просто нужно определить дополнительные производные классы и подключить их в цепочку. Код вызова не нужно менять вообще!