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

Брозовский Максим #250

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

Conversation

BMV989
Copy link

@BMV989 BMV989 commented Nov 13, 2024

No description provided.

private readonly double angleOffset;
private readonly double radius;

public DefaultPointsDistributor(double radius, double angleOffset)

Choose a reason for hiding this comment

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

Разве Default? По-моему расположение происходит по спирали.


namespace TagsCloudVisualization;

public class DefaultPointsDistributor : IPointsDistributor

Choose a reason for hiding this comment

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

А куда он их распределяет?) Больше похоже на генератор

Comment on lines 25 to 29
while (true)
{
yield return GetPointByPolarCords(start, angle);
angle += angleOffset;
}

Choose a reason for hiding this comment

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

А как мне контролировать количество точек? Мне не очень нравится, что если я побегу форичем, у меня цикл никогда не кончится, при этом это будет скрыто в реализации.

А че если я предварительно хочу Linq вызвать? Типа Count(), Single(), Last()

return rectangle;
}

private static Rectangle CreateRectangleWithCenterAndSize(Point center, Size rectangleSize) =>

Choose a reason for hiding this comment

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

А сильно непонятнее станет, если будет просто CreateRectangle?

}

[Test]
[Repeat(15)]

Choose a reason for hiding this comment

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

А зачем нам повторения?

[SetUp]
public void Setup()
{
randomizer = new Random();

Choose a reason for hiding this comment

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

Так, а если у нас будут тесты, в которых не нужен рандом, все равно будем создавать?) Например, с одинаковыми прямоугольниками, с квадратами и тд

randomizer = new Random();
}

[Test]

Choose a reason for hiding this comment

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

Нет тестов на разные параметры спирали, на разные кейсы прямоугольников и тд


namespace TagsCloudVisualization;

public class SpiralCloudLayouter : ICloudLayouter

Choose a reason for hiding this comment

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

А реализовать надо было CircularCloudLayouter :)

Comment on lines 21 to 28
while (true)
{
pointEnumerator.MoveNext();
var rectanglePosition = pointEnumerator.Current;
rectangle = CreateRectangleWithCenterAndSize(rectanglePosition, rectangleSize);

if (!rectangles.Any(rectangle.IntersectsWith)) break;
}

Choose a reason for hiding this comment

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

А какой профит тогда было возвращать IEnumerable, если по итогу мы каждую точку через Enumerator проходим?

private readonly IEnumerator<Point> pointEnumerator;
private readonly List<Rectangle> rectangles = new List<Rectangle>();

public SpiralCloudLayouter(Point center, double radius, double angleOffset)

Choose a reason for hiding this comment

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

При достаточно большом радиусе получается спираль из прямоугольников. В рамках SpiralCloudLayouter норм, но в задаче все-таки CircularCloudLayouter :)

Choose a reason for hiding this comment

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

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

Copy link

@HELLoWorlD01100 HELLoWorlD01100 left a comment

Choose a reason for hiding this comment

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

  • Добавить .gitignore, чтобы твои сбилженные пакеты не грузились на гитхаб.
  • Добавить фон для сгенерированных изображений

Comment on lines 11 to 12
<PackageReference Include="SkiaSharp" Version="3.118.0-preview.1.2" />
<PackageReference Include="SkiaSharp.Views.WindowsForms" Version="3.118.0-preview.1.2" />

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.

не смог задаунгрейдить, понял, в будущем будут инсталить стабильные стараться.
Вот логи:

@ Installing SkiaSharp in TagsCloudVisualization finished (1,803 sec)
[Notification][Install] Install failed (project: TagsCloudVisualization, package: SkiaSharp v2.88.9)
Package restore failed. Rolling back package changes for 'TagsCloudVisualization'.
Package 'OpenTK 3.1.0' was restored using '.NETFramework,Version=v4.6.1, .NETFramework,Version=v4.6.2, .NETFramework,Version=v4.7, .NETFramework,Version=v4.7.1, .NETFramework,Version=v4.7.2, .NETFramework,Version=v ... grade: SkiaSharp from 3.118.0-preview.1.2 to 2.88.9. Reference the package directly from the project to select a different version. 
 TagsCloudVisualization -> SkiaSharp.Views.WindowsForms 3.118.0-preview.1.2 -> SkiaSharp (>= 3.118.0-preview.1.2) 
 TagsCloudVisualization -> SkiaSharp (>= 2.88.9)

Copy link
Author

Choose a reason for hiding this comment

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

ааааа, короче там трабла там на ласт стабильной dotnet 6.0, такие дела


namespace TagsCloudVisualization;

public class CircularCloudLayouter(Point center, IPointsGenerator pointsGenerator) : ICloudLayouter

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.

поправил

Comment on lines 9 to 10
public Point Center => center;
public IEnumerable<Rectangle> Rectangles => rectangles;

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.

Point - Struct, а значит это не проблема (он immutable), подробнее тут - https://stackoverflow.com/questions/3456554/points-properties-in-net
(как и SKPoint). Мне они нужны конкретно в тестах, потому что удобно понимать где центр и доставать прямоугольники для отрисовки случаев когда тесты падают. Эти свойства никак инкапсуляцию не нарушают, они readonly getters.

}
}

public static Rectangle CreateRectangle(Point center, Size rectangleSize) =>

Choose a reason for hiding this comment

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

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

public IEnumerable<Rectangle> Rectangles => rectangles;

public CircularCloudLayouter(Point center) :
this(center, new SpiralPointsGenerator(center, 1d, 0.5d))

Choose a reason for hiding this comment

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

В константы

Comment on lines 10 to 17
private readonly SKBitmap bitmap;
private readonly SKCanvas canvas;

public Visualizer(int width, int height)
{
bitmap = new SKBitmap(width, height);
canvas = new SKCanvas(bitmap);
}

Choose a reason for hiding this comment

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

Ну смотри. Из-за того, что у тебя этот контекст расшарен, а задавать можно разные наборы прямоугольников, я смог добиться вот такого поведения. Код твоих абстракций я не изменял, если что. Нам правда нужно это в поля выносить?
50_TagCloud

Copy link
Author

Choose a reason for hiding this comment

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

Не нужно

canvas = new SKCanvas(bitmap);
}

public SKBitmap VisualizeTagCloud(IEnumerable<Rectangle> rectangles)

Choose a reason for hiding this comment

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

Давай тогда везде использовать абстракции из SkiaSharp. А то странно же получается, что где-то System.Drawing, а где то SkiaSharp) Интерфейс изначальный давай тоже мб поменяем?


namespace TagsCloudVisualization;

public class Visualizer

Choose a reason for hiding this comment

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

Визуалайзер чего?


namespace TagsCloudVisualization;

public class Saver(string imageDirectory)

Choose a reason for hiding this comment

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

Saver чего?

var bitmap = visualizer.VisualizeTagCloud(rectangles);

var saver = new Saver(ImageDirectory);
saver.SaveAsPng(bitmap, $"{NumberOfRectangles}_TagCloud.png");

Choose a reason for hiding this comment

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

Говорим, что сохраним в пнг, но неявно требуем, чтобы в пути тоже было пнг. Можем упростим как-то?

Copy link

@HELLoWorlD01100 HELLoWorlD01100 left a comment

Choose a reason for hiding this comment

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

Тесты еще досмотрю

Comment on lines 45 to 47
var rect = circularCloudLayouter.PutNextRectangle(rectSize);

rect.Should().BeOfType<Rectangle>();

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.

убрал, смысл был проверить тип, что уже и так делает интерфейс

Comment on lines 26 to 37
var currentContext = TestContext.CurrentContext;
if (currentContext.Result.Outcome.Status != TestStatus.Failed) return;

var layoutSize = GetLayoutSize(circularCloudLayouter.Rectangles.ToList());
var visualizer = new Visualizer(layoutSize.Width, layoutSize.Height);
var bitmap = visualizer.VisualizeTagCloud(circularCloudLayouter.Rectangles);

var saver = new Saver(ImagesDirectory);
var filename = $"{currentContext.Test.Name}.png";
saver.SaveAsPng(bitmap, filename);

TestContext.Out.WriteLine($"Tag cloud visualization saved to file {Path.Combine(ImagesDirectory, filename)}");

Choose a reason for hiding this comment

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

TearDown : System.Exception : Unable to allocate pixels for the bitmap.

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
Author

Choose a reason for hiding this comment

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

на каком такое падает?

Copy link
Author

@BMV989 BMV989 Nov 18, 2024

Choose a reason for hiding this comment

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

типа вот
Снимок экрана 2024-11-18 в 15 46 54

Copy link
Author

Choose a reason for hiding this comment

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

кстати теперь оно ровное)
Снимок экрана 2024-11-18 в 20 19 31

Comment on lines 51 to 59
public void PutNextRectangle_ShouldReturnRectangleAtCenter_WhenFirstInvoked()
{
var rectSize = randomizer.NextSize(1, int.MaxValue);

var actualRect = circularCloudLayouter.PutNextRectangle(rectSize);
var expectedRect = CircularCloudLayouter.CreateRectangle(circularCloudLayouter.Center, rectSize);

actualRect.Should().BeEquivalentTo(expectedRect);
}

Choose a reason for hiding this comment

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

Почему мы тестируем один метод через то, что он вызывает внутри себя? Если в этом методе будет баг, то мы не отловим в тестах этого

[Test]
public void PutNextRectangle_ShouldReturnRectangle_WithCorrectSize()
{
var recSize = randomizer.NextSize(1, int.MaxValue);

Choose a reason for hiding this comment

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

зачем имена сокращать тут?

public class CircularCloudLayouterTest
{
private const string ImagesDirectory = "../../../failedTests";
private readonly Random randomizer = new();

Choose a reason for hiding this comment

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

Опять же, рандом не потокобезопасный. Если появятся асинхронные тесты, то придется отлавливать отдельно

Comment on lines 19 to 20
circularCloudLayouter = TestContext.CurrentContext.Test.Name.Contains("Optimal") ?
CreateCircularCloudLayouterWithOptimalParams() : CreateCircularCloudLayouterWithRandomParams();

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.

Я хотел Category поюзать, но стало лень)

Comment on lines 81 to 82
rectangles.Any(fr => rectangles.Any(sr => fr != sr && fr.IntersectsWith(sr)))
.Should().BeFalse();

Choose a reason for hiding this comment

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

Оч запутано, прям вчитываться приходится. Можем упростить?

canvas = new SKCanvas(bitmap);
}

public SKBitmap VisualizeTagCloud(IEnumerable<Rectangle> rectangles)

Choose a reason for hiding this comment

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

При достаточно больших размерах прямоугольников все начинает ломаться

50_TagCloud

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