Skip to content

Conversation

@Curos1ty
Copy link
Owner

@Curos1ty Curos1ty commented Dec 30, 2023

  1. Переименовал класс Calculate - Product 2. заприватил переменные в …
    …классе Product 3. добавил описание для пользователя чтобы завершить программу 4. изменил тип данных с byte на int для переменной amount по кол-ву людей для разделения счета 5. добавил условие для вывода окончания в слове рубль 6. изменил входные данные в методе getTextRub

/*
Возвращает строку, описываюющую правильное окончание в слове "рубль" в зависимости от целочисленной части.
*/
public static String getTextRub(double total, int amount) {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лучше передать в функцию конкретное число, для которого нужно сформировать корректное окончание, а не total и amount. Таким образом, функция станет универсальнее и её будет удобнее тестировать

*/
public static String getTextRub(double total, int amount) {
String textRub;
int rubles = (int) total / amount;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь потенциально может быть деление на 0, перед делением всегда нужно проверять второй аргумент

*/
public static void main(String[] args) {
System.out.println("Hello world!");
byte amount = getValidAmount();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А почему именно byte, а не int? По требованиям нет верхнего ограничения, а ты сделал его - 127 человек, так лучше не делать

byte amount;

while (true) {
Scanner s = new Scanner(System.in);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Лучше создать один экземпляр сканнера на весь класс, чтобы в каждой функции не создавать свой сканнер

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Я это сделал для обхода enter для nextLine, иначе получается, что мне нужно считывать enter перед вводом названия товара второй и последующие разы.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А что в этом плохого? Сейчас всё ещё хуже - каждый раз конструируется новый объект, что является дорогой операцией

Copy link
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В методе getValidAmount я могу вывести scanner за пределы цикла, но в методе addProducts я не могу этого сделать, потому что я считываю название товара через nextLine, потом считываю хочет ли пользователь продолжить добавлять товары, и после того как пользователь вводит любой символ и нажимает enter, этот самый enter (\n) передается для сканнера nextLine и он его считывает как название товара, после чего сразу запрашивается стоимость товара, чтобы этого избежать, пришлось написать так, я не нашел другого способа как этого можно избежать в scanner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

В целом хотя бы из цикла вынести создание сканнера - уже хорошо. Потому что создание объекта не дешёвая операция, а внутри конструктора сканнера ещё и заново открывается входной поток

/*
Предоставляет информацию о товаре.
*/
public static class Calculate {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Класс лучше назвать Product

Comment on lines 109 to 110
double price;
String productName;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Эти поля лучше сделать приватными и пользоваться функциями сеттерами и геттерами

Calculate product = new Calculate(productName, price);
products.append(productName).append("\n");
total += product.getPrice();
System.out.println("Товар успешно добавлен.\nХотите добавить ещё один товар?");

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Здесь лучше вывести, что ожидается от пользователя в вводе. Написать, что нужно ввести "завершить", если пользователь хочет получить результат подсчета

…классе Product 3. добавил описание для пользователя чтобы завершить программу 4. изменил тип данных с byte на int для переменной amount по кол-ву людей для разделения счета 5. добавил условие для вывода окончания в слове рубль 6. изменил входные данные в методе getTextRub
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants