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

Галичев Артем #20

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

Conversation

S4MPAI
Copy link

@S4MPAI S4MPAI commented Dec 19, 2024

@desolver
Copy link

Зачастую в командах ставят себе валидации на лишние пробелы в пустых строках, подсвечивают их зеленым

image
image

В райдере это решается одной настройкой
image

Делать не обязательно (пока в команду не попадешь), но вдруг тебе будет интересно

Comment on lines 10 to 12
using var reader = new StreamReader(filePath);

return reader.ReadToEnd();

Choose a reason for hiding this comment

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

Можно без стрима, просто File.ReadAllText(Async)

Comment on lines 19 to 20
var brush = new SolidBrush(colorFactory.GetColor());
var font = new Font(tag.FontFamily, tag.FontSize);

Choose a reason for hiding this comment

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

Эти штуки тоже IDisposable реализуют

Choose a reason for hiding this comment

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

Раз ты уже относишься к этому проекту, как к библиотеке, давай сделаем его библиотекой полностью - удалим Program.cs и удалим <OutputType>Exe</OutputType> из csproj

Size.Ceiling(_graphics.MeasureString(word, new Font(_fontFamily, fontSize)));
}

public class TagLayouterOptions(int minFontSize, int maxFontSize, string fontName)

Choose a reason for hiding this comment

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

Давай в отдельный файл вынесем, как и в других местах: один файл-один класс/интерфейс/...

{
public int MinFontSize { get; } = minFontSize;
public int MaxFontSize { get; } = maxFontSize;
public FontFamily FontFamily { get; } = ConvertFontNameToFontFamily(fontName);

Choose a reason for hiding this comment

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

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

Copy link
Author

Choose a reason for hiding this comment

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

так оно и так получается через конструктор задается, , было бы написано как FontFamily => ConvertFontNameToFontFamily(fontName);, то да, падало бы при обращении к свойству

Choose a reason for hiding this comment

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

Точно, согласен


namespace TagsCloudVisualization;

public class TagsCloudImageCreator(

Choose a reason for hiding this comment

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

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

Comment on lines 21 to 23
var text = textReaders
.First(x => x.IsCanRead(pathToText))
.ReadWords(pathToText);
Copy link

@desolver desolver Dec 25, 2024

Choose a reason for hiding this comment

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

А если путь до файла передан неверно и файла не существует? Стандартная ошибка может быть недостаточно информативной и упасть в неподходящий момент

Как будто до выполнения основной нагрузки не хватает какого-то валидатора переданных опций при старте программы, который бы понятным языком расшифровывал, что идет не так в случае чего

Это бы позволило убрать валидации из конструкторов, например, из TagLayouter и try-catch по названию шрифта из TagLayouterOptions

{
public static ContainerBuilder RegisterWordAnalytics(this ContainerBuilder builder)
{
builder.RegisterInstance(WordList.CreateFromFiles("Dictionaries/ru/ru.dic"));

Choose a reason for hiding this comment

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

Не обработал кейс, когда словарь не смогли подгрузить, надо пользователю сказать, что не так и что нужно сделать


public static ContainerBuilder RegisterImageSavers(this ContainerBuilder builder, TagsCloudVisualizationOptions options)
{
builder.RegisterType<PngSaver>().WithParameter("path", options.OutputFilePath).As<IImageSaver>();

Choose a reason for hiding this comment

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

Строковые константы - почти всегда очень хрупкое решение: любой ренейм при рефакторинге проекта приведет к тому, что придется править регистрации в контейнере и хорошо ещё, если ошибку заметят сразу и она не попадет на прод. Нужно избавиться от всех строковых констант в регистрации, чтобы заранее защититься от таких проблем

foreach (var rectangle in rectangles)
{
rectangle.Offset(_centerOffset);
graphics.DrawRectangle(GetRandomPen(), rectangle);

Choose a reason for hiding this comment

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

Не освободил ресурсы Pen


namespace TagsCloudVisualizationTests.Base;

[TestFixture]

Choose a reason for hiding this comment

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

Можно не писать во всех тест-классах

namespace TagsCloudVisualizationTests.Base;

[TestFixture]
[Parallelizable(ParallelScope.Self)]

Choose a reason for hiding this comment

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

Это ведь значение по умолчанию, если не ошибаюсь, зачем явно прописывать?

return actualColor;
}

private static TestCaseData[] _getColorsTestCases = [

Choose a reason for hiding this comment

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

Сделал поле, но назвал с _get, как будто это метод

Copy link
Author

@S4MPAI S4MPAI Dec 26, 2024

Choose a reason for hiding this comment

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

ну тут нейминг идет по такому правилу <имя тестируемого метода>TestCases. Стоит как то по другому?

Choose a reason for hiding this comment

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

Понял мысль, но не придумал ничего лучше, как заменить, давай так оставим)

private readonly Random _random = new(Seed);

[Test]
[Repeat(10)]

Choose a reason for hiding this comment

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

Репит в тестах не очень хорошая штука, если это задумано, чтобы сделать тест более стабильным, чтобы он не падал в рандомные промежутки времени. Нужно идти именно от проблемы - почему тест падает и можно ли его сделать стабильным. Вижу, что ты используешь сид для рандома, т.е. он должен всегда одинаковые значения давать, почему тогда требуется репит?

Copy link
Author

Choose a reason for hiding this comment

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

Репит сделан, чтобы убедиться, что в тесте будут рассмотрены разнообразные случаи и метод работает на всех правильно. Сид нужен, чтобы воссоздать упавший кейс и задебажить его (значения в каждом репите не будут повторятся).


[TestFixture]
[Parallelizable(ParallelScope.All)]
[FixtureLifeCycle(LifeCycle.InstancePerTestCase)]

Choose a reason for hiding this comment

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

А это разве не значение по умолчанию?

Copy link
Author

Choose a reason for hiding this comment

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

нет, по умолчанию один экземпляр на все тесты в классе.

Choose a reason for hiding this comment

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

окей

}

[Test]
[Repeat(10)]

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