Conversation
kirillNay
left a comment
There was a problem hiding this comment.
Комментарии с иконкой
Остальные комментарии носят рекомендательный характер.
| @@ -0,0 +1,16 @@ | |||
| public class Formater { | |||
There was a problem hiding this comment.
Хорошая идея вынести в отдельный класс логику форматирования суммы!
Я бы посоветовал вынести из функции format логику вывода результата в консоль и просто отдавать result в качестве результата работы метода.
При таком подходе мы повышаем гибкость нашей программы. Например, если в следующий спринтах при разработке уже Android-приложения нам потребуется функционал форматирования, то мы сможем легко переиспользовать наш класс без внесения изменений формата вывода данных.
Это один из ярких примеров принципа единственной ответственности из принципов SOLID
src/main/java/Formater.java
Outdated
| @@ -0,0 +1,16 @@ | |||
| public class Formater { | |||
| public static void format(double sum, String rub){ | |||
src/main/java/Formater.java
Outdated
| if(sum >= 1 && sum < 2){ | ||
| rub = "рубль"; | ||
| } else{ | ||
| if (sum >= 2 && sum < 5){ |
There was a problem hiding this comment.
Я бы посоветовал избегать лишних вложенных конструкций, чтобы код казался более читаемым. Данную проверку можно заменить на цепочку if else:
if (...) {
...
} else if (...) {
...
}
src/main/java/GroceryList.java
Outdated
| import java.util.Scanner; | ||
|
|
||
| public class GroceryList { | ||
| public static void product(int people) { |
There was a problem hiding this comment.
Функцию product не обязательно делать статичной. Обычно static используется для функций, которые не требуют создания экземпляра класса.
Например, для функции main есть требование, чтобы она была статично и система могла ее вызвать без создать объекта класса Main. Но для GroceryList мы явно создаем объект этого класса
src/main/java/GroceryList.java
Outdated
| public static void product(int people) { | ||
| double sum = 0.0; | ||
| String Products = ("Добавленные товары:"); | ||
| String rub = null; |
There was a problem hiding this comment.
Переменная rub так и остается неизменной и равной null. Вполне возможно, ее инициализация тут осталась по ошибке)
src/main/java/GroceryList.java
Outdated
| System.out.println("Введите название товара"); | ||
| String name = NameProduct.nextLine(); | ||
|
|
||
| Scanner PriceProduct = new Scanner(System.in); |
There was a problem hiding this comment.
Объект класса Scanner - достаточно тяжелый объект и занимает много места в памяти. Мы вполне можем оптимизировать его использование и применять лишь один ранее созданный Scanner при каждом чтении значения из консоли.
Однако тут главное не попасться в ловушку завершения строки. Дело в том, что методы nextInt или nextDouble не считывают символ завершения строки, который мы вводим нажимая "Enter". Из-за этого последующий методы nextLine будет считывать завершение строки, и нам будет казаться, что он игнорируется.
Описание подобной проблемы и ее решение есть на StackOverflow
src/main/java/Main.java
Outdated
| System.out.println("Зачем тебе делить свою еду?\nВведите другое количество"); | ||
| } | ||
| if (people < 1){ | ||
| System.out.println("А положительных друзей у тебя нет?\nВведите положительное число"); |
There was a problem hiding this comment.
А положительных друзей у тебя нет?
😄
src/main/java/Main.java
Outdated
| System.out.println("На скольких человек поделить счёт?"); | ||
|
|
||
| while (true) { | ||
| int people = scanner.nextInt(); |
There was a problem hiding this comment.
Пользователь может ввести на вопрос про количество человек и стоимость товара вместо чисел строки, и приложение упадет. Лучше такого не допускать, а обрабатывать. Для проверки этих ситуаций можно применять методы scanner.hasNextInt() / hasNextFloat() или же оборачивать чтение в try-catch.
src/main/java/GroceryList.java
Outdated
|
|
||
|
|
||
| while(true) { | ||
| double price = PriceProduct.nextDouble(); |
There was a problem hiding this comment.
Нет обработки бесплатных товаров. Если ввести в качестве цены товара 0, то программа не даст продвинуться дальше и будет попрежнему ожидать ввода положительного значения.
src/main/java/Formater.java
Outdated
| if (sum >= 2 && sum < 5){ | ||
| rub = "рубля"; | ||
| } else { | ||
| rub = "рублей"; |
There was a problem hiding this comment.
Для определения правильного падежа слова “рубль” стоит обратить внимание на цифру, на которую оканчивается целочисленное значение итоговой сумма. Например, если итоговый счет будет равен 21, то при выводе мы будет ожидать “21 рубль”. Кроме того, стоит не забывать, что для чисел “11-19” правильный вариант будет “рублей” вне зависимости от того, на что число оканчивается.
|
|
||
| while (true) { | ||
| Scanner NameProduct = new Scanner(System.in); | ||
| Scanner priceProduct = new Scanner(System.in); |
There was a problem hiding this comment.
Название priceProduct предполагает, что данная переменная хранит в себе цену продукта. Но на самом деле это лишь сканнер, который может использоваться для считывания разного рода информации и не отнесящейся к цену за продукт
Поэтому предлагаю для данной переменной использовать название просто scanner
| rub = "рублей"; | ||
| } | ||
| Formater formater = new Formater(); | ||
| formater.result(sum, rub); |
There was a problem hiding this comment.
Для вызове функции result нет необходимости создавать еще один объект класса Formater, ее можно вызвать просто через result(sum, rub);
В комментарии c67a4c4#r1114363706 я имел в виду возможность избавить класс Formater от логики вывода данных. Все, что возвращал бы его метод format - отформатированную строку
А в месте вызова данного метода уже бы обрабатывалась логика вывода данных
| rub = "рубль"; | ||
| } else{ | ||
| if (sum >= 2 && sum < 5){ | ||
| public static void format(double sum){ |
There was a problem hiding this comment.
Как и с классом GroceryList, методы format и result можно оставить без static, т.к. эти методы предполагают создание объекта этих классов

Созадал калькулятор счёта