Conversation
…мечаний по логике и архитектуре
| Gson gson = new Gson(); | ||
| Type type = new TypeToken<Map<String, Double>>() { | ||
| }.getType(); | ||
| Path filePath = Paths.get("src/main/resources/exchangeRate.json"); |
There was a problem hiding this comment.
Если мы захотим поменять путь до файла, нам нужно будет менять этот класс, это не очень хорошо. Вынеси в конструктор.
| mapRates = gson.fromJson(jsonContent, type); | ||
| for (Map.Entry<String, Double> entry : mapRates.entrySet()) { | ||
| if (acceptedCodeCurrency.equals(entry.getKey())) { | ||
| return entry.getValue(); |
There was a problem hiding this comment.
А если не найдем нужный код, что будет? Посмотри как работать с исключениями, попроси пару примеров и начни здесь выбрасывать хотя бы runtimeException с нужным сообщением
| public class JsonFIleRatesGetter implements RatesGetter { | ||
|
|
||
| @Override | ||
| public double getExchangeRates(String acceptedCodeCurrency) throws IOException { |
There was a problem hiding this comment.
Здесь ты говоришь, что может быть IOException, но это опять не про абстракцию. А если мы будем константный курс получать и не будем ни к каким файлам ходить? От IOException в сигнатуре нужно избавится
| import java.io.IOException; | ||
|
|
||
| public interface RatesGetter { | ||
| double getExchangeRates(String acceptedCodeCurrency) throws IOException; |
There was a problem hiding this comment.
Перевод строки до. И опять IOException про него выше писал. Уже объяснял в тг насчеn FNF но ты продолжаешь повторяться
| double conversionResult = converter.convert(amountToConvert, exchangeRateByCurrency); | ||
| userInterface.showToUser("Эквивалент: " + String.format("%.2f", conversionResult)); | ||
| } catch (Exception e) { | ||
| System.out.println(e.getMessage()); |
There was a problem hiding this comment.
А пользователь точно увидит это сообщение из исключения? Или ты не хотела, чтобы он видел ошибки?
| <dependency> | ||
| <groupId>com.google.code.gson</groupId> | ||
| <artifactId>gson</artifactId> | ||
| <version>2.13.2</version> |
There was a problem hiding this comment.
Хорошим тоном в разработке считается выности версию в константу в начало pom. Посмотри как сделать так и сделай.
|
|
||
| public class ConsoleUserInterface implements UserInterface { | ||
|
|
||
| Scanner scanner = new Scanner(System.in); |
There was a problem hiding this comment.
Давай попробуем инициализацию делать в конструторе. На вход конструктор ничего не придет, просто this.scanner = new Scanner(System.in); добавим в него.
|
|
||
| public class ConsoleUserInterface implements UserInterface { | ||
|
|
||
| Scanner scanner = new Scanner(System.in); |
There was a problem hiding this comment.
Давай начинать использовать нужные модификаторы доступа. Почитай посмотри и исправь. А то получается сейчас, твой класс можно "ломануть" , создать объект ConsoleUserInterface, а потом поле scanner засетать на что то другое. И все полетит. Почитай что такое инкапусляция, попроси реальные примермы. От сложных до простых.
| @@ -0,0 +1,18 @@ | |||
| package org.example.communication_with_users; | |||
There was a problem hiding this comment.
И пакет нормально назови userinterface норм, нижние подчеркивания неуместны
…ла логику метода получения значения курса
| this.path = path; | ||
| try { | ||
| this.jsonContent = Files.readString(path, StandardCharsets.UTF_8); | ||
| } catch (Exception e) { |
There was a problem hiding this comment.
Не понял а как это должно работать? Получается вызовем конструктор, чтобы создать объект JsonFIleRatesGetter, получим ошибку например, что такого файла нет и при этом создами объект JsonFIleRatesGetter, который не может считать данные. Проверь это у себя, запусти прилжоение с несуществующим файлом и посмотри, что будет
| Gson gson = new Gson(); | ||
| Type type = new TypeToken<Map<String, Double>>() { | ||
| }.getType(); | ||
| mapRates = gson.fromJson(jsonContent, type); |
There was a problem hiding this comment.
А зачем мы каждый раз будет преобразовыывать json в мапу? может это тоже один раз сделать, как и считаываение из файла?
| String codeCurrency = userInterface.getFromUser(); | ||
| try { | ||
| exchangeRateByCurrency = ratesGetter.getExchangeRates(codeCurrency); | ||
| } catch (RuntimeException e) { |
There was a problem hiding this comment.
А почему два trycatch? Если что то не так ты ведь все равно пропускаешь остальную логику
| try { | ||
| amountToConvert = parseDouble(userInterface.getFromUser()); | ||
| } catch (RuntimeException e) { | ||
| System.out.println("Неправильный формат числа"); |
There was a problem hiding this comment.
Код здесь стал явно выглядеть хуже, ты должна была это заметить, что из красивой логики в несколько строк получается какая то хрень с try catch. Сделай один try catch в цикле и в этом try catch будет вся логика
| } | ||
| } | ||
|
|
||
| public static void main(String[] args) { |
There was a problem hiding this comment.
А это что здесь делает? у нас же был Main класс для этого
| try { | ||
| exchangeRateByCurrency = ratesGetter.getExchangeRates(codeCurrency); | ||
| } catch (RuntimeException e) { | ||
| System.out.println("Неправильный формат кода валюты"); |
| }.getType(); | ||
| mapRates = gson.fromJson(jsonContent, type); | ||
| if (!mapRates.containsKey(acceptedCodeCurrency)) { | ||
| throw new RuntimeException("Код валюты не найден или не существует" + acceptedCodeCurrency); |
There was a problem hiding this comment.
А зачем ты тут message задаешь в exeption если нигда не используешь?
No description provided.