Начнём с добавления денег на баланс. Помните правило? В зависимости от модуля оплаты, начисление происходит по-разному.
Фрагмент 2.3
if(command == "AddMoney")
{
switch (payment)
{
case PaymentType.Coins:
for(int i = 0; i < coinsValues.Length; i++)
{
Console.WriteLine($"Сколько монет номиналом {coinsValues[i]} вы хотите внести?");
int count = 0;
while (!int.TryParse(Console.ReadLine(),
out count))
{
Console.WriteLine("Вы ввели не число!");
}
coinsQuantity[i] += count;
balance += count * coinsValues[i];
}
break;
case PaymentType.Card:
Console.WriteLine("Сколько снять с вашей карты?");
int balanceDelta = 0;
while (!int.TryParse(Console.ReadLine(),
out balanceDelta))
{
Console.WriteLine("Вы ввели не число!");
}
balance += balanceDelta;
Console.WriteLine("Баланс успешно пополнен");
break;
default:
break;
}
}
После того, как мы определились в том, какую команду хочет выполнить пользователь, мы начинаем работать с внутренним состоянием автомата. Для начала мы проверяем то, какой способ оплаты стоит: монеты или карта.
Выбор происходит с помощью оператора switch.
Если выбраны монеты:
Мы по очереди предлагаем пользователю внести монеты доступных номиналов. Эти номиналы прописаны в массиве coinsValues. После ввода количества монет, определенного номинала, мы увеличиваем баланс автомата.
Если выбрана карта:
Мы просто спрашиваем сколько пользователь хочет внести средств и пополняем баланс на эту сумму через увеличение переменной balance.
*Давайте предположим, что пользователь не вводит отрицательные числа.
Здесь мы уже можем видеть дублирующийся код. В случае оплаты монетами нам нужно запрашивать у пользователя некоторое число до тех пор, пока он его не введёт. Это сопряжено с тем, что он может вводить не число или число выходящее за границу вместимости типа int.
Это делается через специфичную конструкцию на основе цикла while.
Фрагмент 2.4
while (!int.TryParse(Console.ReadLine(),
out count))
{
Console.WriteLine("Вы ввели не число!");
}
Эта конструкция имеет явную тенденцию к дублированию. Дублирующийся код – это плохо. Ко мне часто во время моих лекций обращаются студенты, задающие вопрос: “Сколько раз должен продублироваться код, чтобы настало время ликвидировать это?”. Ответ всегда один: “Достаточно одного дублирования”. Подробней эту проблему и способы её решения мы обсудим дальше.