Давайте начнём писать максимально примитивный код. Работать мы будем в обычном консольном проекте. Потому, вам достаточно открыть Visual Studio и создать консольное приложение. Если у вас его нет, то вам стоит в установщике указать пакет “Разработка классических приложений .Net” или просто найти этот проект в репозитории.
Сейчас мы будем работать в рамках класса programm в методе Main. В последующих этапах мы, конечно же, проведём функциональную декомпозицию. Полный листинг этого этапа вы можете найти в WendingMachine\ArraysAndCycles\Programm.cs
Начнём с описания состояния программы. В начале метода Main я определил 6 переменных, первая нужна для хранения текущего баланса. Вторая и третья для доступных монет. В массивах определено то, сколько монет, какого номинала осталось и, соответственно, номинал этих монет. Четвёртая служит для выбора текущей системы оплаты. А три остальных вкупе образуют данные товара.
Фрагмент 2.1
int balance = 0;
int[] coinsQuantity = { 0, 0, 0, 0}; //1, 2, 5, 10
int[] coinsValues = { 1, 2, 5, 10};
PaymentType payment = PaymentType.Card;
string[] names = { "Шоколадка", "Газировка" };
int[] prices = { 70, 60 };
int[] availableQuantity = { 5, 2 };
Да, эти три массива жутко неудобны. Работает это таким образом: определенный индекс подходит ко всем трем массивам. Применяемый к определенному массиву, он позволяет узнать те или иные характеристики товара. Здесь представлены массивы для трёх характеристик: имя, цена и остаток.
В такой организации есть проблема – мы можем добавить имя и забыть добавить цену. Тогда, в дальнейшем программа не будет работать корректно. Т.е тут отсутствует целостность данных. Но эй, вы же помните, что мы крутимся, как можем? Но проблему мы уже видим и в будущем совершим героический подвиг – избавимся от неё.
Идём дальше, теперь нам нужно организовать цикл обработки команд в приложении с консолью. Он заключается в том, чтобы запустить бесконечный цикл, каждая итерация которого, считывает с консоли строку и интерпретирует ее с помощью операторов управления. В дальнейшем, мы попробуем написать гибкую систему через АОП, а пока что, куча условных операторов. Выглядит это так:
Фрагмент 2.2
string command = "";
while (true)
{
Console.Clear();
Console.WriteLine($"Баланс {balance}");
Console.WriteLine("Введите команду:");
command = Console.ReadLine();
if(command == "AddMoney")
{
}
else if(command == "GetChange")
{
}
else if (command.StartsWith("BuyGood"))
{
}
else
{
Console.WriteLine("Команда не определена");
}
Console.ReadLine();
}
Как вы видите, мы и впрямь гоняем бесконечный цикл и каждый раз, когда мы оказываемся внутри него, мы сообщаем пользователю баланс (с помощью интерполяции строк) и просим ввести строку, которую мы попытаемся распознать как команду.
Сразу после, мы напрямую проверяем строку, и если она равна строке например “AddMoney”, то выполняем команду, которая скрыта под этим именем. В случае с AddMoney — добавление баланса.
Что теперь? Нужно сделать имплементацию команд.