Я начинающий программист, изучаю C# в качестве хобби. Я пишу навигатор библиотеки, в котором пользователь может искать книги по имени, жанру, автору и т. д. Я достиг конца этого проекта, и до сих пор я решал все проблемы и решал их самостоятельно. Но сейчас я застрял и поэтому пишу на StackOverflow, чтобы получить помощь от экспертов. Постараюсь максимально понятно объяснить свою проблему.
Моя программа в настоящее время включает 4 книжных жанра: ужасы, художественная литература, фэнтези и мистика.
Так как в будущем я могу добавить больше жанров, я не хочу продираться через сотни строк кода, чтобы отредактировать оператор if/case и добавить новый жанр.
Есть ли практический способ централизовать всю информацию, которую я могу редактировать в будущем, в одном месте?
Ниже приведены списки, которые я объявил:
public static List<string> bookList = new List<string> {"shindler's list", "it", "maltese falcon", "bfg", "hobbit"};
public static List<string> fiction = new List<string> {"shindler's list"};
public static List<string> fantasy = new List<string> {"bfg", "hobbit"};
public static List<string> horror = new List<string> {"it"};
public static List<string> mystery = new List<string> {"maltese falcon"};
Теперь эти списки вызываются из различных частей кода, таких как этот:
case "1":
Seperation();
Console.Clear();
Console.Write("Enter book name: ");
var bookTitleUserInput = Console.ReadLine();
Console.WriteLine("You searched for: " + bookTitleUserInput);
foreach (string s in bookList)
{
if (s.ToLowerInvariant() == bookTitleUserInput.ToLowerInvariant())
{
Console.WriteLine("\n");
Seperation();
OutputBookSummary(bookTitleUserInput.ToLowerInvariant());
Seperation();
if (fiction.Contains(bookTitleUserInput.ToLowerInvariant()))
{
Console.WriteLine("Genre: Fiction");
Console.WriteLine("\n");
}
else if (horror.Contains(bookTitleUserInput.ToLowerInvariant()))
{
Console.WriteLine("Genre: Horror");
Console.WriteLine("\n");
}
else if (mystery.Contains(bookTitleUserInput.ToLowerInvariant()))
{
Console.WriteLine("Genre: Mystery");
Console.WriteLine("\n");
}
else if (fantasy.Contains(bookTitleUserInput.ToLowerInvariant()))
{
Console.WriteLine("Genre: Fantasy");
Console.WriteLine("\n");
}
else
{
Console.WriteLine("");
}
break;
}
}
И код типа:
case "4":
Console.Clear();
Console.WriteLine("Settings Menu");
Seperation();
Console.WriteLine("1) Search By Genre");
Console.WriteLine("2) Search By Author");
Console.WriteLine("3) Search By Book Name");
Console.WriteLine("4) Back to Main Menu");
Seperation();
Console.Write("Choice: ");
var settingsMenuSelection = Console.ReadLine();
switch (settingsMenuSelection)
{
case "1":
Console.WriteLine("1) Horror");
Console.WriteLine("2) Mystery");
Console.WriteLine("3) Fiction");
Console.WriteLine("4) Fantasy");
var genreMenuSelection = Console.ReadLine();
break;
Таким образом, если бы мне пришлось редактировать код, чтобы добавить больше жанров, мне пришлось бы прокручивать код и редактировать их по отдельности. Не говоря уже о беспорядке и путанице, которые это создаст.
Я попытался поместить блок операторов if case 1:
в отдельный метод, но это не сработало. Я также пытался поместить все в другой класс и вызвать оттуда блоки case 1:
и case 4:
, но это тоже не сработало.
Под неработающим я подразумеваю, что Genre:
+ жанр не выводился на консоль.
Итак, в двух словах, есть ли способ централизовать весь вышеприведенный код, чтобы, если появится новая книга/жанр/автор, мне не пришлось перемещаться? Потому что я думаю, что это было бы плохой практикой.
Заранее спасибо и извините за длинный пост!