-
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
Ослина Анастасия #15
base: master
Are you sure you want to change the base?
Ослина Анастасия #15
Conversation
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.
Резюмируя, вышел прикольный код!
Мне нравится, что в нём не забывается уничножение IDisposable
переменных. А классы, которые делают лишь одну вещь, удобно читать, это здорово! Есть конечно местами забытые ключевые слова но это совсем уж мелочи. Тем не менее, напомнил о них на всякий случай в комментариях ниже.
Облако тегов тоже выглядит интересно. Правда, некоторые слова совсем невозможно прочитать, исправишь?
Сейчас интересно увидеть, как будут встроены дополнительные реализации интерфейсов
|
||
public class Program | ||
{ | ||
static void Main(string[] args) |
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.
resolved
upd: нет, не совсем.
Мне не понятно, почему команда сообщает о двух ошибках одновременно:
Required option 'i, inputFilePath' is missing.
Required option 'o, outputDirectory' is missing.
Value cannot be null. (Parameter 'instance')
Кажется, в данном случае правильно показать только требуемые параметры, а не null reference exception.
В то же время важно сохранить настоящие исключения, чтобы в случае ошибок было понятно, как исправлять
TagsCloudVisualization/WordPreprocessors/WordValidators/DefaultWordValidator.cs
Outdated
Show resolved
Hide resolved
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()); | ||
} |
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.
У Dictionary
разве определён порядок?
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.
resolved
TagsCloudVisualization/WordPreprocessors/FontCreators/IFontCreator.cs
Outdated
Show resolved
Hide resolved
var builder = new ContainerBuilder(); | ||
builder.RegisterInstance(options).AsSelf().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.
Меня несколько смущает, что объект 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.
Добавила конфиг для минимального и максимального размера шрифта |
В итоге реализовала два пункта в перспективу: чтение разных входных форматов (txt, doc, docx) и разные генераторы цветов (рандом и градиент), пример градиента подгрузила |
|
||
public IEnumerable<Tuple<string, int>> ProcessTextToWords(string text) | ||
{ | ||
var analysis = myStem.Analysis(text).Split("\r\n", StringSplitOptions.RemoveEmptyEntries); |
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.
[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); | ||
} |
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.
[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); | ||
} |
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.
Кажется, тест ProcessTextToWords_ShouldContainCorrectCountOfWords
дублирует тест ProcessTextToWords_ShouldContainOnlyNotBoringWordsReducedToInitialFormWithLowerCase
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; } |
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.
А в проекте с тестами nullable context не выключен )
public Font CreateFont(int fontSizeFactor) | ||
{ | ||
var fontSize = Math.Min(Math.Max(minFontSize, fontSizeFactor), maxFontSize); | ||
|
||
return new Font(fontName, fontSize); | ||
} |
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.
Было бы здорово интерполировать размер шрифта.
Например, для { ("попугай", 3), ("кошка", 2), ("собака", 1) }
при maxFontSize = 10
, minFontSize = 5
размер шрифта был таким:
"попугай" -> 10
"кошка" -> 7.5
"собака" -> 5
Сейчас просто на маленьких количествах разница не особо заметна
@Folleach