-
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
Дмитрий Леонтьев #26
base: master
Are you sure you want to change the base?
Дмитрий Леонтьев #26
Conversation
@@ -1,16 +0,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.
Кажись это было лишним
MSBUILD : error MSB1009: файл проекта не существует.
|
||
public class SpiralGeneratorSettings(double angleOffset, double spiralStep, Point center) | ||
{ | ||
public double AngleOffset { get; private set; } = angleOffset; |
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.
Если нужна неизменяемость для этих целей существует record, предлагаю переделать
public record SpiralGeneratorSettings(double AngleOffset, double SpiralStep, Point Center);
TagCloudConsoleApp/Program.cs
Outdated
containerBuilder.RegisterType<TxtTextReader>().As<ITextReader>().SingleInstance(); | ||
containerBuilder.RegisterType<ImageSaver>().As<IImageSaver>().SingleInstance(); | ||
containerBuilder.RegisterType<TagCloudImageGenerator>(); | ||
//containerBuilder.RegisterType<BoringWordsTextFilter>().As<ITextFilter>().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.
В продуктовом коде не должно быть закоменченого кода, вызывает вопросы, усложняет поддержание
|
||
namespace TagsCloudVisualization.Client; | ||
|
||
public class Client(string[] args) : IClient |
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.
Относится к настройкам консольного приложения?
Предлагаю перенести в TagCloudConsoleApp.csproj
И переименовать в SettingsProvider, сейчас не отражает суть и путает с существующим термином
{ | ||
public List<string> ApplyFilter(IEnumerable<string> text) | ||
{ | ||
//TODO: implement boring words filter |
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.
Это же у нас обязательный пункт? https://github.com/kontur-courses/di-updated/blob/master/HomeExercise.md
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 TagsCloudVisualization.Generator; | ||
|
||
public class SpiralPositionGenerator(SpiralGeneratorSettings settings) : IPositionGenerator |
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,77 @@ | |||
using System.Drawing; |
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.
Предлагаю еще немного поработать над структурой проекта.
Парочку распространённых в проектах вещей:
- Интерфейсы создавать в отдельной директории Interfaces
- Модельки в Models
- Использовать в названии множественное число, например не Filter, а Filters
- В названии директорий использовать существительные. Например Draw - глагол. Я бы назвал Visualizatiuon и сложил бы туда связанную с отображением логику общую для всех клиентов
public static bool IntersectsWithAnyOf(this Rectangle rectangle, IEnumerable<Rectangle> rectangles) => | ||
rectangles.Any(rectangle.IntersectsWith); | ||
|
||
public static void ShiftAlongXAxis(this Rectangle rectangle, int shift) |
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.
А не нужно было сделать это в предыдущей задаче?) На сколько помню, это было одно из требований к решению
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 CircularCloudLayouter cloudLayouter; | ||
private RectangleDraftsman drawer; | ||
private ImageSaver imageSaver; |
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.
"Non-nullable field 'imageSaver' is uninitialized. Consider declaring the field as nullable"
Предлагаю вынести получение настроек непосредственно в метод сохранения, а не на весь инстанс класса. Инициализировать SetUp
[TestCase(0, 1)] | ||
public void Constructor_OnInvalidArguments_ThrowsArgumentException(int width, int height) | ||
{ | ||
Action action = () => new RectangleDraftsman(width, height); |
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
[Test] | ||
public void CreateImage_WhenListOfRectanglesIsNull_ThrowsArgumentException() | ||
{ | ||
var action = () => drawer.CreateImage(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!
- CreateImage никак не обрабатывает параметры входящие, сейчас так получилось что он бросит NullReference по ходу работы...
…t different image formats, and made it possible to influence the list of boring words that won't get into the cloud
</ItemGroup> | ||
|
||
<ItemGroup> | ||
<Folder Include="Models\" /> |
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.
Она используется?
TagCloudConsoleApp/Program.cs
Outdated
using TagsCloudVisualization.Settings; | ||
|
||
var options = Parser.Default.ParseArguments<CommandLineOptions>(args).Value; | ||
var client = new SettingsProvider(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.
client?
.OrderByDescending(words => words.Count()) | ||
.ToDictionary(words => words.Key, words => words.Count()); | ||
|
||
minWordCount = wordsFrequency.Values.Min(); |
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.
Предлагаю объявлять переменные в методе и передавать в параметрах метода или воспользоваться анонимным методом. Изменение общих полей класса может привести к непредвиденными багам с ростом сложности кода
IBitmapGenerator bitmapGenerator, | ||
IEnumerable<ITextFilter> filters) | ||
{ | ||
private readonly int maxFontSize = textSettings.MaxFontSize; |
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.
Почему нельзя просто обратиться к textSettings.MaxFontSize, для чего создавать readonly поле?
public SettingsManager GetSettings() | ||
{ | ||
return new(new BitmapGeneratorSettings(new(options.ImageWidth, options.ImageHeight), | ||
GetColor(options.BackgroundColor), |
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 значенияPossible null reference argument for parameter 'color' in 'TagCloudConsoleApp. SettingsProvider. SettingsProvider. GetColor'
{ | ||
var text = fileReadersSelector.SelectFileReader().ReadText(); | ||
|
||
var wordsFrequency = filters |
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.
Не хватает тестов на работы фильтров
.Select(w => new TagWord(w.Key, GetFontSize(w.Value))); | ||
|
||
var bitmap = bitmapGenerator.GenerateBitmap(words); | ||
saver.SaveImageToFile(bitmap, saveSettings); |
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.
Не хватает тестов на основной сценарий.
Как вариант можно задуматься о скриншотом тестировании. Оно широко распространено для тестирования интерфейсов на фронте. Сравнивать эталонную картинку выкладки при прогоне тестов после внесения правок. Можно поискать такие библиотеки для .net
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.
Сделал сравнение по пикселям
void RegisterFileReaders(ContainerBuilder containerBuilder) | ||
{ | ||
containerBuilder.RegisterType<TxtTextReader>().Keyed<ITextReader>(".txt"); | ||
containerBuilder.RegisterType<DocTextReader>().Keyed<ITextReader>(".doc"); |
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 TagsCloudVisualization.Interfaces; | ||
using TagsCloudVisualization.Settings; | ||
|
||
namespace TagsCloudVisualization.Models.Generators; |
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.
Почему в папке models все генераторы, фильтры и т.д.
boringWords.Remove(word); | ||
} | ||
|
||
public void RemoveBoringWords(IEnumerable<string> words) |
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.
больше не используемых методов)
тут те же проблемы, что и с законченным кодом: возникают вопросы, сложность поддержки, читаемости, вес образа программы.
бывают случаи когда на будущее фиксируют и намечают интерфейсы и функционал, тогда можно пометить комментарием TODO и указать когда планируется реализовать или после чего станет не нужным и можно выпилить
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.
Я их добавил как возможности влиять на список скучных слов, просто не использовал в своём коде, что нужно делать в таком случае? Использовать их в тестах?
@shiyoi