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

базовая реализация структуры, алгоритма распределения и визуализации #247

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

Conversation

m1nus0ne
Copy link

No description provided.

Copy link

@GarageManager GarageManager left a comment

Choose a reason for hiding this comment

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

В целом по структуре критичных вопросов нет, балл за предпроверку я поставлю

Круто, что ты использовал интерфейсы, это очень правильный подход - завязываться на абстракции вместо реализаций.

Правда основной целью задания было написание логики с использованием TDD, а тут тестов совсем нет, значит и принцип этот использован, к сожалению, не был.


private Rectangle RectangleFromParams(Size nextRectangleSize)
{
var x = (int)(center.X + currentOffset * Math.Cos(currentAngle)); //надо центровать?

Choose a reason for hiding this comment

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

По желанию. Я бы центровал, так, на мой взгляд, "правильнее", но это не принципиально

@GarageManager
Copy link

Еще хочу добавить, что желательно выделять отдельные коммиты для разных логически отделимых частей задачи. Это помогает понять ход твоих мыслей, помогло бы при написании с использованием TDD, а так же в целом формирует привычку более структурного подхода к написанию кода

Copy link

@GarageManager GarageManager left a comment

Choose a reason for hiding this comment

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

Нет тестов на CircularCloudLayouter(

Их тоже нужно добавить, потому что в нем есть логика, которую стоит проверить

}
}

private Rectangle MakeRectangleFromSize(Size nextRectangleSize)

Choose a reason for hiding this comment

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

По-хорошему логика с прямоугольниками должна была лежать в CircularCloudLayouter. Классу CircularPositionCalculator по идее не нужно ничего знать о прямоугольниках. либо о каких-то других фигурах, которые мы захотим размещать на окружностях. Если отталкиваться от S в SOLID, то ответственность класса CircularPositionCalculator заключается в нахождении следующей точки, на которую потенциально можно поставить прямоугольник или любую другую фигуру, а сами фигуры и операции над ними должны лежать на уровень выше - в CircularCloudLayouter.

Текущая реализация создает несколько проблем:

  1. При добавлении другого алгоритма расстановки фигур нам потребуется не просто алгоритм подсчета точки написать в новом классе, но и продублировать всю логику с прямоугольниками.
  2. Если мы захотим размещать, допустим, ромбы, а не прямоугольники, то нам придется вносить изменения прямо в CircularPositionCalculator, т.к. он сильно завязан на сами фигуры.
  3. Покрывать тестами этот класс сложнее, чем если бы он отвечал только за получение точек.

namespace BaseCloudDrawer_Tests;

[TestFixture]
public class BaseCloudDrawer_Tests

Choose a reason for hiding this comment

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

На классы, которые формируются какие-то файлы, лучше всего писать Approval-тесты, обычные unit тут не очень хорошо подходят

var fileName = "test_image";
var format = ImageFormat.Png;

drawer.SaveToFile(bitmap, fileName, testDirectory, format);

Choose a reason for hiding this comment

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

На этот метод тесты можно было не писать, т.к. он внутри себя не содержит какой-то логики, а просто вызывает стандартный метод из шарповой библиотеки, тесты на который должны писать разработчики этой библиотеки. Мы, если ее используем, ей доверяем и дополнительные тесты можем не писать


var result = layouter.PutNextRectangle(size);

result.IntersectsWith(layouter.Rectangles[0]).Should().BeFalse();

Choose a reason for hiding this comment

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

Мы для тестов поле Rectangles сделали публичным, что не очень хорошо, т.к. оно стал публичным не только для тестов, но и для любого пользователя нашего класса. Я бы тут предложил самостоятельно складывать прямоугольники в коллекцию в самом тесте и проверять в конце, что они не пересекаются.

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