Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ослина Анастасия #15

Open
wants to merge 5 commits into
base: master
Choose a base branch
from

Conversation

malinaboky
Copy link

Copy link

@Folleach Folleach left a comment

Choose a reason for hiding this comment

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

Резюмируя, вышел прикольный код!
Мне нравится, что в нём не забывается уничножение IDisposable переменных. А классы, которые делают лишь одну вещь, удобно читать, это здорово! Есть конечно местами забытые ключевые слова но это совсем уж мелочи. Тем не менее, напомнил о них на всякий случай в комментариях ниже.

Облако тегов тоже выглядит интересно. Правда, некоторые слова совсем невозможно прочитать, исправишь?

Сейчас интересно увидеть, как будут встроены дополнительные реализации интерфейсов

TagsCloudVisualization/TagsCloudVisualization.csproj Outdated Show resolved Hide resolved
TagsCloudVisualization/ConsoleCommands/Options.cs Outdated Show resolved Hide resolved
TagsCloudVisualization/ConsoleCommands/Options.cs Outdated Show resolved Hide resolved

public class Program
{
static void Main(string[] args)

Choose a reason for hiding this comment

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

Странно, что при неправильном вызове приложения выводится Exception в конце подсказки
image

Copy link

@Folleach Folleach Dec 27, 2024

Choose a reason for hiding this comment

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

resolved

upd: нет, не совсем.

Мне не понятно, почему команда сообщает о двух ошибках одновременно:

Required option 'i, inputFilePath' is missing.
Required option 'o, outputDirectory' is missing.
Value cannot be null. (Parameter 'instance')

image

Кажется, в данном случае правильно показать только требуемые параметры, а не null reference exception.
В то же время важно сохранить настоящие исключения, чтобы в случае ошибок было понятно, как исправлять

TagsCloudVisualization/ConsoleCommands/Options.cs Outdated Show resolved Hide resolved
Comment on lines 14 to 22
public Dictionary<string, int> ProcessWords(IEnumerable<string> words)
{
return words.SelectMany(word => word.Split())
.Where(word => !string.IsNullOrEmpty(word))
.GroupBy(word => word.ToLower())
.Where(group => wordValidator.IsValid(group.Key))
.OrderByDescending(group => group.Count())
.ToDictionary(group => group.Key, group => group.Count());
}

Choose a reason for hiding this comment

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

У Dictionary разве определён порядок?

Choose a reason for hiding this comment

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

resolved

TagsCloudVisualization/Layouters/CircularCloudLayouter.cs Outdated Show resolved Hide resolved
Comment on lines 20 to 21
var builder = new ContainerBuilder();
builder.RegisterInstance(options).AsSelf().SingleInstance();
Copy link

@Folleach Folleach Dec 20, 2024

Choose a reason for hiding this comment

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

Меня несколько смущает, что объект Options это синглтон, который позволяет себя модифицировать.
Какой-то из компонентов может воспользоваться этим и поменять некоторые значения, ожидая, что у него личный экземпляр настроек, словно локальная переменная.

Choose a reason for hiding this comment

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

Несмотря на то, что по умолчанию Autofac регистрирует как per dependency, тут зарегистрирован конкретный объект options. Autofac не будет его копировать, поэтому шанс случайной модификации остаётся возможен
image

@malinaboky
Copy link
Author

malinaboky commented Dec 23, 2024

Облако тегов тоже выглядит интересно. Правда, некоторые слова совсем невозможно прочитать, исправишь?

Добавила конфиг для минимального и максимального размера шрифта

@malinaboky
Copy link
Author

В итоге реализовала два пункта в перспективу: чтение разных входных форматов (txt, doc, docx) и разные генераторы цветов (рандом и градиент), пример градиента подгрузила


public IEnumerable<Tuple<string, int>> ProcessTextToWords(string text)
{
var analysis = myStem.Analysis(text).Split("\r\n", StringSplitOptions.RemoveEmptyEntries);

Choose a reason for hiding this comment

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

Если создать файл в unix-like операционной системе, то переносом строк будет только символ \n.
image

Comment on lines +10 to +26
[TestCaseSource(nameof(WordValidatorSourceTestCases))]
public void IsValid_ShouldValidateCorrectly(WordInfo wordInfo, bool isValid)
{
new DefaultWordValidator().IsValid(wordInfo).Should().Be(isValid);
}

private static IEnumerable<TestCaseData> WordValidatorSourceTestCases()
{
yield return new TestCaseData(new WordInfo { Grammeme = "CONJ", Lemma = "text" }, false);
yield return new TestCaseData(new WordInfo { Grammeme = "INTJ", Lemma = "text" }, false);
yield return new TestCaseData(new WordInfo { Grammeme = "PART", Lemma = "text" }, false);
yield return new TestCaseData(new WordInfo { Grammeme = "PR", Lemma = "text" }, false);
yield return new TestCaseData(new WordInfo { Grammeme = "SPRO", Lemma = "text" }, false);
yield return new TestCaseData(new WordInfo { Grammeme = "V", Lemma = "text" }, true);
yield return new TestCaseData(new WordInfo { Grammeme = "NUM", Lemma = "text" }, true);
yield return new TestCaseData(new WordInfo { Grammeme = "A", Lemma = "text" }, true);
}

Choose a reason for hiding this comment

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

В IDE тесты отображаются, будто их 2.
Хотя на деле больше

image

Comment on lines +34 to +56
[Test]
public void ProcessTextToWords_ShouldContainOnlyNotBoringWordsReducedToInitialFormWithLowerCase()
{
var words = ReadTestFile();
var result = new List<Tuple<string, int>>
{
new("кошка", 2),
new("собака", 3)
};

var wordProcessor = Scope.Resolve<IWordPreprocessor>();
wordProcessor.ProcessTextToWords(words).Should().BeEquivalentTo(result);

}

[Test]
public void ProcessTextToWords_ShouldContainCorrectCountOfWords()
{
var words = ReadTestFile();

var wordProcessor = Scope.Resolve<IWordPreprocessor>();
wordProcessor.ProcessTextToWords(words).Should().HaveCount(2);
}

Choose a reason for hiding this comment

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

Кажется, тест ProcessTextToWords_ShouldContainCorrectCountOfWords дублирует тест ProcessTextToWords_ShouldContainOnlyNotBoringWordsReducedToInitialFormWithLowerCase

Comment on lines +19 to +23
private ConsoleApp ConsoleApp { get; set; }
private ILifetimeScope Scope { get; set; }
private IWordPreprocessor WordPreprocessor { get; set; }
private ICloudLayouter Layouter { get; set; }
private Options Options { get; set; }

Choose a reason for hiding this comment

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

А в проекте с тестами nullable context не выключен )

Comment on lines +19 to +24
public Font CreateFont(int fontSizeFactor)
{
var fontSize = Math.Min(Math.Max(minFontSize, fontSizeFactor), maxFontSize);

return new Font(fontName, fontSize);
}

Choose a reason for hiding this comment

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

Было бы здорово интерполировать размер шрифта.

Например, для { ("попугай", 3), ("кошка", 2), ("собака", 1) }
при maxFontSize = 10, minFontSize = 5
размер шрифта был таким:

"попугай" -> 10
"кошка" -> 7.5
"собака" -> 5

Сейчас просто на маленьких количествах разница не особо заметна

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