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

Сахабутдинов Ильфир #10

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

Conversation

ILFirV-V
Copy link

var wordSettings = wordSettingsProvider.GetWordSettings();
var text = fileReader.ReadText(options.InputPath);
var analyzeWords = textPreprocessor.GetWordFrequencies(text, wordSettings);
using var image = wordsCloudVisualizer.CreateImage(imageSettings, analyzeWords);

Choose a reason for hiding this comment

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

Здесь смешались ответственности (SRP): простановка опций и непосредственная генерация. Учитывая, что все остальные хендлеры исключительно про работу с опциями, то и здесь второй домен нужно вынести

Copy link
Author

Choose a reason for hiding this comment

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

Разбил на несколько опций


public string Execute(ImageSettingsOptions options)
{
ChangeSettings(options);

Choose a reason for hiding this comment

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

Я так понимаю, это не change, а скорее set, т.к. у пользователя лишь единственная возможность проставить настройки

Copy link
Author

Choose a reason for hiding this comment

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

Пользователь может менять настройки как до генерации, так и после. Настройки после запишутся для следующей генерации. Переименовал

{
imageSettingsProvider.SetWordColor(options.WordColor);
}
if (!options.FontFamily.Equals(currentSettings.FontFamily))

Choose a reason for hiding this comment

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

Почему-то у меня есть вот такая странная ошибка
image

{
private readonly IReadOnlyCollection<IHandler> handlers;

private readonly IReadOnlySet<Type> optionsTypes = new HashSet<Type>()

Choose a reason for hiding this comment

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

Давай их тоже получать через DI

Copy link
Author

Choose a reason for hiding this comment

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

Сделал


private void Handle(IOptions options)
{
var message = string.Empty;

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.

Переделал. Сейчас вывожу сообщение о том что нет нужной команды

using TagsCloudContainer.TagsCloudVisualization.Logic.SizeCalculators;
using TagsCloudContainer.TagsCloudVisualization.Models.Settings;
using TagsCloudContainer.TagsCloudVisualization.Providers.Interfaces;

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.

Добавил тестов

{
public bool TryExecute(IOptions options, out string result)
{
if (options is ExitOptions exitOptions)

Choose a reason for hiding this comment

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

Предлагаю подумать, можно ли переделать архитектуру или подход на полиморфизме?

Запрещено использовать операторы if, switch, ?: и прочие условные операторы, если их можно заменить полиморфизмом.

Choose a reason for hiding this comment

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

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

Если переделывать, то можно это все убрать и сделать сильно проще. Достаточно не требовать от пользователя ввода данных во время работы приложения, а требовать конфигурировать запуск exe'шника параметрами запуска. Это сразу упростит код, уберет if'ы, появится примеры запуска программы в ридми с разными параметрами, а также для генерации облака потребуется только одно нажатие enter)

public IReadOnlyCollection<ViewWord> CalculateWordSizes(IReadOnlyDictionary<string, int> wordFrequencies,
int minSize = 8, int maxSize = 24)
{
if (wordFrequencies is null || wordFrequencies.Count == 0)

Choose a reason for hiding this comment

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

В каких случаях wordFrequencies может быть null?

Copy link
Author

Choose a reason for hiding this comment

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

Изменил. Таких случаев сейчас нет

protected override void Load(ContainerBuilder builder)
{
var configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json")

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.

Переделал. Получаю путь программно

var app = builder.Build();
using var scope = app.BeginLifetimeScope();
var appRunner = scope.Resolve<ITagsCloudContainerUi>();
appRunner.Run();

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.

Добавил Readme.md и примеры в папке Examples

Ilfir Sakhabutdinov added 15 commits December 22, 2024 23:56
…кации размещения и логики расстановки прямоугольников
@@ -0,0 +1,146 @@
## Мануал по использованию консольного приложения Tags Cloud Container

Приложение позволяет генерировать облака тегов из текстовых файлов с возможностью настройки различных параметров.

Choose a reason for hiding this comment

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

Мануал просто супер) очень подробно и детально! 🔥🔥🔥

{
public static IServiceCollection AddTagsCloudVisualization(this IServiceCollection services)
{
services.AddTransient<ILayouter, Layouter>();

Choose a reason for hiding this comment

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

А в чем разница этих трех lifecycle? Почему решил использовать именно в таком сочетании?


private Bitmap VisualizeWords(Bitmap bitmap, IReadOnlyCollection<ViewWord> viewWords, ImageSettings imageSettings)
{
var container = containerCreator.GetOrNull() ?? throw new ArgumentNullException(nameof(containerCreator));

Choose a reason for hiding this comment

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

Может он все-таки не null?

Copy link
Author

Choose a reason for hiding this comment

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

Если мы не зарегистрировали сервис, который нужен, то получим null. Я решил что лучше пусть падает там где получаем, чем там где используем

Choose a reason for hiding this comment

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

А можно ли научить DI при старте проверять, зарегестрированы ли все зависимости?)

var center = imageSettings.Size.Center();
var circularCloudLayouter = new Layouter(imageSettingsProvider, rectanglePlacementStrategy);

var rectangles = sizes.Select(size => circularCloudLayouter.PutNextRectangle(size)).ToList();

Choose a reason for hiding this comment

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

А нам правда нужно делать ToList?

</AssemblyAttribute>
</ItemGroup>
<ItemGroup>
<Folder Include="Logic\" />

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.

Убрал

@@ -0,0 +1,27 @@
using Autofac;

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.

Добавил

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