-
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
Рушкова Ольга #29
base: master
Are you sure you want to change the base?
Рушкова Ольга #29
Conversation
TagCloudDI/Program.cs
Outdated
var builder = new ContainerBuilder(); | ||
|
||
builder.RegisterType<LowerCaseTransformer>().As<IWordTransformer>(); | ||
builder.RegisterType<BoredSpeechPartFilter>().As<IWordFilter>(); | ||
builder.RegisterType<RemoveEmptyWords>().As<IWordFilter>(); | ||
builder.RegisterType<CircularCloudLayouter>().As<ICloudLayouter>(); | ||
builder.RegisterType<CloudCreator>(); | ||
builder.RegisterType<CloudVisualizer>(); | ||
builder.RegisterType<DataProvider>(); | ||
builder.RegisterType<RandomWordColorDistributor>().As<IWordColorDistributor>(); | ||
builder.RegisterType<LiteratureTextParser>().As<IDataParser>(); | ||
builder.Register<Func<string, IFileDataSource>>(c => | ||
{ | ||
var ctx = c.Resolve<IComponentContext>(); | ||
return p => ctx.ResolveKeyed<IFileDataSource>(p); | ||
}); | ||
builder.RegisterType<TxtFileDataSource>().Keyed<IFileDataSource>(".txt"); | ||
builder.RegisterType<DocFileDataSource>().Keyed<IFileDataSource>(".doc"); | ||
builder.RegisterType<DocxFileDataSource>().Keyed<IFileDataSource>(".docx"); | ||
builder.RegisterType<App>().SingleInstance(); | ||
builder.RegisterType<VisualizeSettings>().SingleInstance(); |
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 контейнера выделим в отдельный метод и попробуй логически разделить регистрацию - хотим добавить новый фильтр идем в метод где регистрируются фильтры и добавляем - примерно такая логика чтобы была
public interface IWordTransformer | ||
{ | ||
public WordInfo Apply(WordInfo word); | ||
} |
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.
Не согласна. Трансформеры как-то по своим правилам меняют значение слова, но при этом у них нет логики "это подходит, это не подходит", поэтому как будто бы при попытке расширить их идею до фильтров мы скрываем, что внутри себя они на самом деле меняют значение слова. Да и фильтрации как таковой не будет, потому что по сути трансформер будет все значения считать валидными, просто он их перед этим поменяет.
Можно попробовать подумать в сторону расширения фильтров до трансформеров, но тогда тоже может появиться странная логика по типу "это слово не подходит под условие, сделаю его форму некорректной, чтобы что-то другое эту некорректную форму потом из выборки удалило"
Мне кажется и тот. и другой вариант хуже разделения их на два интерфейса, хотя я могу просто не видеть какого-то более красивого решения по приведению их к чему-то общему
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.
Скорее у нас разное представление о том, что такое фильтр. Я могу себе представить, что фильтр может иметь логику приведения данных к общем формату, наравне как и, например, исключать какие-то данные или минимально на них влиять. Но в общем это не критично и тут по разному можно трактовать, поэтому я согласен с тобой, что вариант разделения более чем хороший
|
||
namespace TagCloudDI.WordHandlers | ||
{ | ||
internal class RemoveEmptyWords : IWordFilter |
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.
Давай сделаем названия у фильтров такими, чтобы было понятно что это фильтры. То есть везде будем писать в конце Filter (EmptyWordsFilter)
{ | ||
public bool Accept(WordInfo word) | ||
{ | ||
return word.InitialForm != "" || word.InitialForm != 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.
string.IsNullOrEmpty
TagCloudDI/Program.cs
Outdated
builder.RegisterType<TxtFileDataSource>().Keyed<IFileDataSource>(".txt"); | ||
builder.RegisterType<DocFileDataSource>().Keyed<IFileDataSource>(".doc"); | ||
builder.RegisterType<DocxFileDataSource>().Keyed<IFileDataSource>(".docx"); |
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.
Если на вход поступит файл с другим расширением, всё не должно развалиться, я не уверен, но вроде сейчас сломается так как не будет ни одной зарегистрированной реализации IFileDataSource
this.distributor = distributor; | ||
} | ||
|
||
public string CreateImage((string Word, double Frequency)[] source, string? filePath = 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.
Не интуитивно понятно почему CreateImage возвращает string, может будем возвращать картинку и далее её уже как-то сохранять?
graphics.DrawString(currentWord.Word, font, new SolidBrush(color), currentWord.WordBorder); | ||
} | ||
imageSaver.SaveImage(image); | ||
var resizedImage = new Bitmap(image, settings.ImageSize == Size.Empty ? tmpImageSize : settings.ImageSize); |
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.
Давай попытаемся избавиться от такой логики settings.ImageSize == Size.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.
По странной логике с ресайзами: я динамически рассчитываю размер картинки, чтобы облако в эту картинку точно влезло и двигаю облако внутрь этой картинки (чтобы не было ситуации, когда часть облака находится где-то за изображением). А потом уже скейлю получившуюся картинку по пользовательским настройкам
Можно сделать так: дефолтно рассчитывать динамически, а при наличии корректных пользовательских настроек не скейлить вообще, но тогда как будто бы всё равно появится логика с if
No description provided.