Conversation
Also added case 3 (Brute Force decryption) to Runner class for automatic key detection.
|
|
||
| public static class Result { | ||
| public final int key; | ||
| public final String text; |
There was a problem hiding this comment.
Используйте Java 16+ Records вместо вложенного статического класса Result. Это сократит код и сделает данные иммутабельными (Data Transfer Object).
|
|
||
| public final class StopWords { | ||
| public static final Set<String> RUSSIAN = new HashSet<>(Arrays.asList( | ||
| "и", "в", "на", "не", "что", "как", "я", "он", "она", "но", "с", |
There was a problem hiding this comment.
Используйте Set.of(...) вместо HashSet(Arrays.asList(...)). В Java 9+ это создает немодифицируемое множество и выглядит чище.
| char shifted = alphabet.getCharByIndex(index + key); | ||
| return isUpper ? Character.toUpperCase(shifted) : shifted; | ||
| } | ||
|
|
There was a problem hiding this comment.
В Java 21+ для выбора реализации или обработки данных стоит использовать Pattern Matching для switch, если планируется расширение типов действий.
| } | ||
| return count; | ||
| } | ||
|
|
There was a problem hiding this comment.
Используйте Stream API для подсчета слов: tokens.stream().filter(stopSet::contains).count(). Это декларативно и читаемо.
|
|
||
| public Alphabet(String text) { | ||
| if (text.matches(".*[а-яА-ЯёЁ].*")) { | ||
| ALPHABET = RUSSIAN; |
There was a problem hiding this comment.
Логика выбора алфавита в конструкторе нарушает SRP. Лучше использовать паттерн Factory или статические фабричные методы, возвращающие разные экземпляры Alphabet.
| int matches = Math.max(rusMatches, engMatches); | ||
|
|
||
| if (matches > bestScore) { | ||
| bestScore = matches; |
There was a problem hiding this comment.
Магическое число 1000 для shortenForAnalysis следует вынести в именованную константу (static final).
| public class TextUtils { | ||
| private static final Pattern WORD_PATTERN = Pattern.compile("\\b[а-яёА-ЯЁa-zA-Z']+\\b"); | ||
|
|
||
| public static String normalize(String text) { |
There was a problem hiding this comment.
Регулярное выражение компилируется каждый раз при вызове replaceAll. Используйте предварительно скомпилированный статический Pattern.
| package com.javarush.emirzakov.model; | ||
|
|
||
| public class Alphabet { | ||
| private final char[] ALPHABET; |
There was a problem hiding this comment.
Поле ALPHABET нарушает naming convention. Поля экземпляра должны быть в camelCase (alphabet), даже если они final.
|
|
||
| int bestScore = -1; | ||
| Result best = null; | ||
|
|
There was a problem hiding this comment.
Метод findBestByStopWords слишком длинный. Разбейте его на мелкие методы: calculateScore, processCandidate.
|
|
||
| import com.javarush.emirzakov.model.Alphabet; | ||
|
|
||
| public abstract class CryptoAction { |
There was a problem hiding this comment.
Сделайте CryptoAction sealed интерфейсом, разрешая только конкретные реализации (Encrypt/Decrypt). Это обеспечит безопасность иерархии в Java 21.
demologin
left a comment
There was a problem hiding this comment.
Поставил оценку С из-за сроков, так было бы конечно больше.
No description provided.