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

Дмитрий Леонтьев #26

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

Conversation

Dary0302
Copy link

@@ -1,16 +0,0 @@

Copy link

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;
Copy link

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);

containerBuilder.RegisterType<TxtTextReader>().As<ITextReader>().SingleInstance();
containerBuilder.RegisterType<ImageSaver>().As<IImageSaver>().SingleInstance();
containerBuilder.RegisterType<TagCloudImageGenerator>();
//containerBuilder.RegisterType<BoringWordsTextFilter>().As<ITextFilter>().SingleInstance();
Copy link

@shiyois shiyois Dec 20, 2024

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
Copy link

@shiyois shiyois Dec 21, 2024

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
Copy link

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

Copy link
Author

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
Copy link

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;
Copy link

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)
Copy link

Choose a reason for hiding this comment

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

Не нашел использования в коде. Для чего они нужны?
{87B628BB-F250-408F-A836-97AAFA69085D}

Copy link
Author

Choose a reason for hiding this comment

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

Я хотел эти методы использовать для логики притягивания прямоугольников к центру, но пока что не успел

Copy link

@shiyois shiyois Dec 26, 2024

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.

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

{
private CircularCloudLayouter cloudLayouter;
private RectangleDraftsman drawer;
private ImageSaver imageSaver;
Copy link

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);
Copy link

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);
Copy link

Choose a reason for hiding this comment

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

  1. null!
  2. 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\" />
Copy link

Choose a reason for hiding this comment

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

Она используется?

using TagsCloudVisualization.Settings;

var options = Parser.Default.ParseArguments<CommandLineOptions>(args).Value;
var client = new SettingsProvider(options);
Copy link

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();
Copy link

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;
Copy link

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),
Copy link

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
Copy link

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);
Copy link

Choose a reason for hiding this comment

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

Не хватает тестов на основной сценарий.
Как вариант можно задуматься о скриншотом тестировании. Оно широко распространено для тестирования интерфейсов на фронте. Сравнивать эталонную картинку выкладки при прогоне тестов после внесения правок. Можно поискать такие библиотеки для .net

Copy link
Author

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");
Copy link

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;
Copy link

@shiyois shiyois Dec 26, 2024

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)
Copy link

@shiyois shiyois Dec 26, 2024

Choose a reason for hiding this comment

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

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

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