Conversation
|
|
||
| // Размер алфавита (количество символов в массиве chars) | ||
| public static final int size = chars.length; | ||
|
|
There was a problem hiding this comment.
Используйте Stream API для инициализации карты: IntStream.range(0, chars.length).boxed().collect(Collectors.toMap(i -> chars[i], i -> i)). Статические блоки инициализации — это устаревший императивный стиль.
| */ | ||
| public int showMenu() { | ||
| System.out.println(""" | ||
| Выберите режим работы(введите цифру): |
There was a problem hiding this comment.
Используйте текстовые блоки (Text Blocks) Java 15+ для меню, но дополните их методом formatted() или Pattern Matching для switch (Java 21). Это сделает код более декларативным.
|
|
||
| /** | ||
| * Выполняет выбранный пользователем режим работы. | ||
| * |
There was a problem hiding this comment.
В Java 21 switch может возвращать значение и поддерживать проверку типов. Рекомендуется переписать логику на switch expression, чтобы избежать дублирования кода scanner.nextLine() и сделать структуру более компактной.
| } | ||
|
|
||
| int read; // Переменная для хранения считанного символа (в виде int) | ||
| while ((read = reader.read()) != -1) { // Читаем файл посимвольно, пока не достигнем конца (-1) |
There was a problem hiding this comment.
Для циклического сдвига индекса в Java лучше использовать Math.floorMod(index - key, Alphabet.size). Это заменяет ручную проверку if (newIndex < 0) и делает код математически чище.
| } | ||
|
|
||
| String stringfile = reader.readLine(); // Читаем первую строку файла | ||
| String[] strarray = stringfile.split(" "); // Разбиваем строку на массив слов по пробелам |
There was a problem hiding this comment.
Ошибка логики: вызов new FileNotFoundException(); просто создает объект исключения, но не выбрасывает его. Необходимо использовать ключевое слово throw.
| /** Ключ для шифрования/дешифрования. */ | ||
| int key; | ||
|
|
||
| /** |
There was a problem hiding this comment.
Поля source, destination, key не должны быть полями класса Main. Это состояние должно передаваться через параметры методов, чтобы обеспечить потокобезопасность и чистоту кода.
| private static int findBestKey(Map<Character, Double> representativeFreq, Map<Character, Double> encryptedFreq) { | ||
| int bestKey = 0; // Лучший ключ | ||
| double minError = Double.MAX_VALUE; // Минимальная ошибка (начальное значение — максимум) | ||
|
|
There was a problem hiding this comment.
Для вычисления error (суммы квадратов разностей) идеально подходит Stream API: Arrays.stream(Alphabet.chars).mapToDouble(...).sum(). Это делает алгоритм более читаемым.
| * @throws FileNotFoundException если файл-источник отсутствует | ||
| */ | ||
| public static void searchKey(String source, String dest){ // Метод для перебора ключей и попытки взлома | ||
| try(BufferedReader reader = new BufferedReader(new FileReader(source))){ // Открываем исходный файл для чтения |
There was a problem hiding this comment.
Статическая переменная key используется для хранения промежуточного состояния. Это делает метод нереентерабельным и опасным при многопоточном выполнении. Используйте локальную переменную.
| System.out.println("Расшифровка завершена"); // Сообщаем пользователю, что процесс завершён | ||
| } catch (FileNotFoundException e) { // Обработка ошибки: файл не найден | ||
| System.out.println("Ошибка: файл не найден"); | ||
| } catch (IllegalArgumentException e) { // Обработка ошибки: недопустимый ключ |
There was a problem hiding this comment.
Пустой блок catch (Exception e) {} — это антипаттерн 'Swallowed Exception'. Как минимум, добавьте логирование ошибки, иначе отладка станет невозможной.
| int total = 0; // Общее количество символов | ||
|
|
||
| try(BufferedReader reader = new BufferedReader(new FileReader(source))){ // Открываем файл для чтения | ||
| if(!Files.exists(Path.of(source))){ // Проверяем, существует ли файл |
There was a problem hiding this comment.
Использование Files.exists вместе с new FileReader избыточно. Современный подход Java 21 — использовать Files.newBufferedReader(Path) и обрабатывать исключения напрямую.
demologin
left a comment
There was a problem hiding this comment.
Поставил оценку C. Сроки повлияли
No description provided.