Skip to content

Написал программу, написаны основной класс и методы - #1

Open
Curos1ty wants to merge 2 commits into
mainfrom
dev
Open

Curos1ty wants to merge 2 commits into
mainfrom
dev

Conversation

@Curos1ty

@Curos1ty Curos1ty commented Dec 30, 2023 •

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

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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

Comment thread src/main/java/Main.java Outdated
*/
public static String getTextRub(double total, int amount) {
String textRub;
int rubles = (int) total / amount;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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

Comment thread src/main/java/Main.java Outdated
byte amount;

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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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

Copy link
Copy Markdown
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 перед вводом названия товара второй и последующие разы.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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

Copy link
Copy Markdown
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

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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

Comment thread src/main/java/Main.java Outdated
/*
Предоставляет информацию о товаре.
*/
public static class Calculate {

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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

Comment thread src/main/java/Main.java Outdated
Comment on lines +109 to +110
double price;
String productName;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

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

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

Copy link
Copy Markdown

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.

2 participants