Skip to content

Завершенное задание#1

Open
black-wolf17 wants to merge 3 commits intomainfrom
dev
Open

Завершенное задание#1
black-wolf17 wants to merge 3 commits intomainfrom
dev

Conversation

@black-wolf17
Copy link
Copy Markdown
Owner

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

Copy link
Copy Markdown

@kirillNay kirillNay left a comment

Choose a reason for hiding this comment

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

Комментарии с иконкой ⚠️ пометил как критические, их исправление важно для прохождения на следующий этап.
Остальные комментарии носят рекомендательный характер.

@@ -0,0 +1,16 @@
public class Formater {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Хорошая идея вынести в отдельный класс логику форматирования суммы!
Я бы посоветовал вынести из функции format логику вывода результата в консоль и просто отдавать result в качестве результата работы метода.

При таком подходе мы повышаем гибкость нашей программы. Например, если в следующий спринтах при разработке уже Android-приложения нам потребуется функционал форматирования, то мы сможем легко переиспользовать наш класс без внесения изменений формата вывода данных.

Это один из ярких примеров принципа единственной ответственности из принципов SOLID

@@ -0,0 +1,16 @@
public class Formater {
public static void format(double sum, String rub){
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Стоит сделать аргумент rub локальной переменной функции, т.к. мы нигде не используем значение, которое функции передали извне.

Также можно обратить внимание на подсказки Android Studio
image

if(sum >= 1 && sum < 2){
rub = "рубль";
} else{
if (sum >= 2 && sum < 5){
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Я бы посоветовал избегать лишних вложенных конструкций, чтобы код казался более читаемым. Данную проверку можно заменить на цепочку if else:

if (...) {
   ...
} else if (...) {
   ...
}

import java.util.Scanner;

public class GroceryList {
public static void product(int people) {
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 не обязательно делать статичной. Обычно static используется для функций, которые не требуют создания экземпляра класса.

Например, для функции main есть требование, чтобы она была статично и система могла ее вызвать без создать объекта класса Main. Но для GroceryList мы явно создаем объект этого класса

public static void product(int people) {
double sum = 0.0;
String Products = ("Добавленные товары:");
String rub = null;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Переменная rub так и остается неизменной и равной null. Вполне возможно, ее инициализация тут осталась по ошибке)

System.out.println("Введите название товара");
String name = NameProduct.nextLine();

Scanner PriceProduct = 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.

Объект класса Scanner - достаточно тяжелый объект и занимает много места в памяти. Мы вполне можем оптимизировать его использование и применять лишь один ранее созданный Scanner при каждом чтении значения из консоли.

Однако тут главное не попасться в ловушку завершения строки. Дело в том, что методы nextInt или nextDouble не считывают символ завершения строки, который мы вводим нажимая "Enter". Из-за этого последующий методы nextLine будет считывать завершение строки, и нам будет казаться, что он игнорируется.
Описание подобной проблемы и ее решение есть на StackOverflow

System.out.println("Зачем тебе делить свою еду?\nВведите другое количество");
}
if (people < 1){
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.

А положительных друзей у тебя нет?

😄

System.out.println("На скольких человек поделить счёт?");

while (true) {
int people = scanner.nextInt();
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️
Пользователь может ввести на вопрос про количество человек и стоимость товара вместо чисел строки, и приложение упадет. Лучше такого не допускать, а обрабатывать. Для проверки этих ситуаций можно применять методы scanner.hasNextInt() / hasNextFloat() или же оборачивать чтение в try-catch.



while(true) {
double price = PriceProduct.nextDouble();
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, то программа не даст продвинуться дальше и будет попрежнему ожидать ввода положительного значения.

if (sum >= 2 && sum < 5){
rub = "рубля";
} else {
rub = "рублей";
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️
Для определения правильного падежа слова “рубль” стоит обратить внимание на цифру, на которую оканчивается целочисленное значение итоговой сумма. Например, если итоговый счет будет равен 21, то при выводе мы будет ожидать “21 рубль”. Кроме того, стоит не забывать, что для чисел “11-19” правильный вариант будет “рублей” вне зависимости от того, на что число оканчивается.


while (true) {
Scanner NameProduct = new Scanner(System.in);
Scanner priceProduct = 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.

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

Поэтому предлагаю для данной переменной использовать название просто scanner

rub = "рублей";
}
Formater formater = new Formater();
formater.result(sum, rub);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Для вызове функции result нет необходимости создавать еще один объект класса Formater, ее можно вызвать просто через result(sum, rub);

В комментарии c67a4c4#r1114363706 я имел в виду возможность избавить класс Formater от логики вывода данных. Все, что возвращал бы его метод format - отформатированную строку

А в месте вызова данного метода уже бы обрабатывалась логика вывода данных

rub = "рубль";
} else{
if (sum >= 2 && sum < 5){
public static void format(double sum){
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Как и с классом GroceryList, методы format и result можно оставить без static, т.к. эти методы предполагают создание объекта этих классов

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