Skip to content

Timoshenko. 4 tasks complete. Rady CryptoAnaliz!#18

Open
FunnyDaniik wants to merge 2 commits intodemologin:mainfrom
FunnyDaniik:main
Open

Timoshenko. 4 tasks complete. Rady CryptoAnaliz!#18
FunnyDaniik wants to merge 2 commits intodemologin:mainfrom
FunnyDaniik:main

Conversation

@FunnyDaniik
Copy link

No description provided.

@FunnyDaniik FunnyDaniik changed the title Timoshenko. 3 tasks complete. Rady CryptoAnaliz! Timoshenko. 4 tasks complete. Rady CryptoAnaliz! Aug 31, 2025
Copy link
Owner

@demologin demologin left a comment

Choose a reason for hiding this comment

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

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


if (isRussian) {
expectedFrequencies = new double[]{
0.0801, 0.0159, 0.0454, 0.0170, 0.0298, 0.0845, 0.0094, 0.0165, 0.0735,
Copy link
Owner

Choose a reason for hiding this comment

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

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

letterCount = 32;
} else {
expectedFrequencies = new double[]{
0.0812, 0.0149, 0.0271, 0.0432, 0.1202, 0.0230, 0.0203, 0.0592, 0.0731,
Copy link
Owner

Choose a reason for hiding this comment

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

тут тоже самое

return calculateFrequencySimilarity(text, sampleText);
}

private double calculateLetterFrequency(String text) {
Copy link
Owner

Choose a reason for hiding this comment

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

Дизайн этого метода неудачный, практически всегда если число строк в методе превышает один скролл, а это примерно 25 строк, его разбивают на подметоды каждому из которых дают осмысленное названия

};
letterCount = 32;
} else {
expectedFrequencies = new double[]{
Copy link
Owner

Choose a reason for hiding this comment

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

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

import java.util.Map;

public class CaesarCipher {
public static final char[] RUSSIAN_ALPHABET = {
Copy link
Owner

Choose a reason for hiding this comment

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

по смыслу это конечно константа, однако технически это массив. А значение массива всегда можно изменить. Поэтому в общем случае лучше не обозначать массивы константными именами

try {
Files.write(Paths.get(filePath), content.getBytes());
} catch (IOException e) {
throw new CipherException("Ошибка записи в файл: " + filePath, e);
Copy link
Owner

Choose a reason for hiding this comment

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

вот тут правильный подход

private double calculateFrequencyScore(int[] freq1, int[] freq2) {
double score = 0;
for (int i = 0; i < freq1.length; i++) {
if (freq2[i] > 0) {
Copy link
Owner

Choose a reason for hiding this comment

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

в именах переменных лучше сокращений не использовать никогда

return frequency;
}

private double calculateFrequencyScore(int[] freq1, int[] freq2) {
Copy link
Owner

Choose a reason for hiding this comment

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

суффиксы один и два не говорят мне о назначении этих массивов абсолютно ничего, expectedFrequency и actualFrequency было бы намного информативнее

import com.javarush.timoshenko.exception.CipherException;
import java.util.Scanner;

public class MainApp {
Copy link
Owner

Choose a reason for hiding this comment

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

данный класс выполняет сразу две функции с одной стороны он собирает все компоненты приложения вместе, а с другой стороны отвечает пользовательский ввод, реализацию вызова расчётной функциональности, и вывод результатов. Очевидно что его нужно разбить как минимум на несколько классов, по одному на каждое направление ответственности

}
}

public static void main(String[] args) {
Copy link
Owner

Choose a reason for hiding this comment

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

самые важные методы идут самыми первыми, а второстепенные опускаются в конец класса, так проще понимать логику его работы

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