Repository navigation
Conversation
| calculatorObject.addMyItem(itemName, itemPrice); | ||
| System.out.println("Товар " + itemName + " успешно добавлен!" + | ||
| " Хотите ли добавить ещё один товар?"); | ||
| myTotal = calculatorObject.calculateMyTotal(); |
There was a problem hiding this comment.
Есть предложение не вычислять сумму на каждой итерации цикла добавления товара, а производить подсчет только при выводе результатов. Это позволит оптимизировать код программы и избежать лишних вычислений. Также можно будет удалить переменную myTotal.
| if ((Math.floor(myTotal / allGuests) >= 1.0) && (Math.floor(myTotal / allGuests) < 2)) { | ||
| String myResult = "Счет на каждого: %.2f рубль"; | ||
| System.out.println(String.format(myResult, myTotal / allGuests)); | ||
| } else if ((Math.floor(myTotal / allGuests) >= 2) && (Math.floor(myTotal / allGuests) < 4.99)) { | ||
| String myResult = "Счет на каждого: %.2f рубля"; | ||
| System.out.println(String.format(myResult, myTotal / allGuests)); | ||
| } | ||
| else if((Math.floor(myTotal / allGuests) < 1) || (Math.floor(myTotal / allGuests) >= 5)){ | ||
| String myResult = "Счет на каждого: %.2f рублей"; | ||
| System.out.println(String.format(myResult, myTotal / allGuests)); | ||
| } |
There was a problem hiding this comment.
В каждом условии происходит повторяющийся расчет myTotal / allGuests. Давай заранее вычислим это значение и сохраним его в переменной, а затем будем использовать это значение в условиях if-else. Это позволит избежать повторных вычислений одного и того же значения в каждом условии и сделает код более эффективным и читаемым.
| class Item { | ||
| String itemName; | ||
| double itemPrice; | ||
|
|
||
| Item(String itemName, double itemPrice) { | ||
| this.itemName = itemName; | ||
| this.itemPrice = itemPrice; | ||
| } |
There was a problem hiding this comment.
Отлично, что ты организовал логику программы в отдельные классы. Также стоит рассмотреть возможность создания отдельного файла для каждого класса. Это улучшит структуру проекта и облегчит навигацию по коду.
| String myResult = "Счет на каждого: %.2f рубль"; | ||
| System.out.println(String.format(myResult, myTotal / allGuests)); |
There was a problem hiding this comment.
Вместо использования функции format, которая создает новую отформатированную строку, можно воспользоваться функцией printf, которая позволяет форматировать вывод напрямую при его осуществлении:
String myResult = "Счет на каждого: %.2f рубль %n";
System.out.printf(myResult, myTotal / allGuests);
…ссы по файлам; поправил printf; убрал лишний расчет общей суммы при выводе; обработал пустоту пр ивводе названия товара (по комменту в ревью)
…ссы по файлам; поправил printf; убрал лишний расчет общей суммы при выводе; обработал пустоту при вводе названия товара (по комменту в ревью) + также верное склонение обработал
|
Привет! Спасибо большое за ревью и за советы, подсказки. Пришлось еще поломать голову над замечаниями. Мне кажется, что поправил те, что были по первому ревью:
Также постарался последовать советам и поправить код по комментариям из ПР. Надеюсь, что удастся пройти ревью. И буду очень благодарен, если получится еще раз по возможности подсказать, что можно было бы улучшить |
| if (scan.hasNextLine()) { | ||
| if (scan.nextLine().equalsIgnoreCase("Завершить")) { | ||
| break; | ||
| } | ||
| } |
There was a problem hiding this comment.
Условие можно раскрыть и переписать следующим образом:
if (scan.hasNextLine() && scan.nextLine().equalsIgnoreCase("Завершить")) {
break;
}
Если первое условие вернет false, то второе не будет проверяться. Таким образом мы убираем лишнюю вложенность.
| public void printFormatResult(double myTotal, int allGuests) { | ||
| double sumResult = myTotal / allGuests; | ||
| int endNumber = (int) sumResult % 10; | ||
| if ((Math.floor(sumResult) >= 1.0) && (Math.floor(sumResult) < 2)) { |
There was a problem hiding this comment.
Отлично, что ты сохранил результат выражения myTotal / allGuests в переменную. Однако, можно также добавить еще одну переменную, чтобы сохранить туда результат округления. Это позволит избежать повторного вычисления выражения Math.floor.
P.S.
Также можно сразу преобразовать переменную в int и сравнивать уже с целочисленными значениями (как ты это сделал для endNumber).
| } else if (endNumber == 1) { | ||
| String myResult = "Счет на каждого: %.2f рубль"; | ||
| System.out.printf(myResult, sumResult); | ||
| } else if (endNumber >= 5 && endNumber <= 9) { |
There was a problem hiding this comment.
Выражение endNumber <= 9 всегда будет возвращать true, потому что (int) sumResult % 10 может принимать значения от 0 до 9.
| String itemName = ""; | ||
| while (scan.hasNextLine()) { | ||
| itemName = scan.nextLine(); | ||
| if (itemName.trim().isEmpty()) { |
There was a problem hiding this comment.
Ты уверен, что нет такого метода у String?
itemName.isBlank()
Также лучше перед добавлением товара удалять пробелы как раз при помощи trim().
| import java.util.ArrayList; | ||
|
|
||
| class Calculator { | ||
| ArrayList<Item> itemsList = new ArrayList<>(); |
There was a problem hiding this comment.
Лучше сделать переменную закрытой (private), чтобы ограничить доступ к ней только внутри класса и предотвратить ее изменение извне, что способствует лучшей инкапсуляции данных и сокрытию внутренних деталей реализации класса.
| while (true) { | ||
| System.out.println("Какая цена у товара?"); | ||
| if (scan.hasNextDouble()) { | ||
| itemPrice = scan.nextDouble(); | ||
| if (itemPrice < 0) { | ||
| System.out.println("Отрицательное значение. Введите заново."); | ||
| } else { | ||
| scan.nextLine(); | ||
| break; | ||
| } | ||
| } else if (!scan.hasNextDouble()) { | ||
| System.out.println("Некорректное значение. Надо ввести в формате: 00,00"); | ||
| scan.nextLine(); | ||
| } | ||
| } |

ПР по 1-й дз. Буду очень благодарен, если получится объяснить ошибки или сложные моменты.