Возможное решение

Давайте начнём писать максимально примитивный код. Работать мы будем в обычном консольном проекте. Потому, вам достаточно открыть 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 — добавление баланса.

Что теперь? Нужно сделать имплементацию команд.

Если вы нашли ошибку, пожалуйста выделите её и нажмите Ctrl+Enter.


Leave a Reply

Your email address will not be published. Required fields are marked *