-
Notifications
You must be signed in to change notification settings - Fork 32
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
base: master
Are you sure you want to change the base?
Conversation
var wordSettings = wordSettingsProvider.GetWordSettings(); | ||
var text = fileReader.ReadText(options.InputPath); | ||
var analyzeWords = textPreprocessor.GetWordFrequencies(text, wordSettings); | ||
using var image = wordsCloudVisualizer.CreateImage(imageSettings, analyzeWords); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Здесь смешались ответственности (SRP): простановка опций и непосредственная генерация. Учитывая, что все остальные хендлеры исключительно про работу с опциями, то и здесь второй домен нужно вынести
There was a problem hiding this comment.
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); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Я так понимаю, это не change
, а скорее set
, т.к. у пользователя лишь единственная возможность проставить настройки
There was a problem hiding this comment.
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)) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
{ | ||
private readonly IReadOnlyCollection<IHandler> handlers; | ||
|
||
private readonly IReadOnlySet<Type> optionsTypes = new HashSet<Type>() |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Давай их тоже получать через DI
There was a problem hiding this comment.
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; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
А при каком раскладе возможна ситуация, что после запуска программа не отработает? И правда ли такая возможность должна быть? Если правда, то может ошибку кидать?
There was a problem hiding this comment.
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; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Не забудь написать тесты на всю логику, которую требуется сделать по заданию)
There was a problem hiding this comment.
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) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Предлагаю подумать, можно ли переделать архитектуру или подход на полиморфизме?
Запрещено использовать операторы if, switch, ?: и прочие условные операторы, если их можно заменить полиморфизмом.
There was a problem hiding this comment.
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) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
В каких случаях wordFrequencies
может быть null?
There was a problem hiding this comment.
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") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Предлагаю попробовать не завязываться на внешние файлы. Хочется уметь конфигурировать запуск программы только из единой точки
There was a problem hiding this comment.
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(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Можешь добавить в реп сгенерированные примеры? И какой-нибудь мануал, как запускать твою программу? Мб с примером, чтобы я его просто скопировал, вставил и все заработало? Любые варианты удобнее принимаются)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Добавил Readme.md и примеры в папке Examples
…oft Dependency Injection
…и построении круга
…кации размещения и логики расстановки прямоугольников
- Изменены интерфейсы - Выделен отдельный обработчик для настроек путей файлов - Добавлены проверки перед изменением настроек
@@ -0,0 +1,146 @@ | |||
## Мануал по использованию консольного приложения Tags Cloud Container | |||
|
|||
Приложение позволяет генерировать облака тегов из текстовых файлов с возможностью настройки различных параметров. |
There was a problem hiding this comment.
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>(); |
There was a problem hiding this comment.
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)); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Может он все-таки не null?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Если мы не зарегистрировали сервис, который нужен, то получим null. Я решил что лучше пусть падает там где получаем, чем там где используем
There was a problem hiding this comment.
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(); |
There was a problem hiding this comment.
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\" /> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Лишнее
There was a problem hiding this comment.
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; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Еще не хватает теста, проверяющего работу всей программы
Добавь несколько более крупных тестов, проверяющих работу всей программы в сборе.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Добавил
@dmitgaranin