Какой код чище, быстрее или элегантнее / предпочтительнее? Есть ли функция, которая делает это уже? - PullRequest
1 голос
/ 06 августа 2011

Я написал оба из них для исправления прямоугольников. Например, если у прямоугольника есть эти свойства:

X: 32, Y: 32, ширина: -32, высота: -32

Это сделает прямоугольник X: 0, Y: 0, Ширина: 32, Высота: 32

if (r.Width < 0)
{
    r.X -= Math.Abs(r.Width);
    r.Width = Math.Abs(r.Width);
}
if (r.Height < 0)
{
    r.Y -= Math.Abs(r.Height);
    r.Height = Math.Abs(r.Height);
}

Вот # 2

r.X -= Math.Abs(Math.Min(0, r.Width));
r.Width = Math.Abs(r.Width);

r.Y -= Math.Abs(Math.Min(0, r.Height));
r.Height = Math.Abs(r.Height);

Они оба работают просто отлично. Мой вопрос какой? Я чувствую, что первый может быть быстрее и более читабельным, но второй имеет меньше строк кода. Кроме того, я чувствую, что это то, что, возможно, уже изобретено. Есть ли метод, который делает это уже в .NET или XNA Framework?

Спасибо !!

Редактировать: Кто-то опубликовал сокращенную версию второго способа, которая мне действительно нравится, и объединил ее в это:

r = new Rectangle(r.X + Math.Min(0, r.Width), r.Y + Math.Min(0, r.Height), Math.Abs(r.Width), Math.Abs(r.Height));

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

Ответы [ 2 ]

3 голосов
/ 06 августа 2011

Если вы знаете, что r.Width и r.Height равны <0, зачем вам Abs для них? Удалите это, и это будет еще быстрее и проще. </p>

if (r.Width < 0)
{
    r.X += r.Width;
    r.Width = -r.Width;
}
if (r.Height < 0)
{
    r.Y += r.Height;
    r.Height = -r.Height;
}

ИМХО, второй способ, который вы написали, просто ужасен. Вы не смотрите на это и сразу понимаете, что он делает. Помни ПОЦЕЛУЙ.

РЕДАКТИРОВАТЬ: я понимаю, вам нравится ваш код в наименьшем количестве строк, поэтому я переделал выше:

if (r.Width < 0) { r.X += r.Width; r.Width = -r.Width; } if (r.Height < 0) { r.Y += Height; r.Height = -r.Height; }

Так же просто - и все в одной строке кода! В строке даже меньше символов, чем в вашей альтернативе ...

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

1 голос
/ 06 августа 2011

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

После проверки, являются ли значения отрицательными, вы знаете, что они отрицательные, поэтому вам не нужно никаких Math.Abs:

if (r.Width < 0) {
    r.Width = -r.Width;
    r.X -= r.Width;
}
if (r.Height < 0) {
    r.Height = -r.Height;
    r.Y -= r.Height;
}

Только для полноты, второй также может быть написан, будет меньше Math.Abs звонков, поскольку вы знаете знак того, что выходит из Math.Min, когда оно не равно нулю:

r.X += Math.Min(0, r.Width);
r.Width = Math.Abs(r.Width);
r.Y += Math.Min(0, r.Height);
r.Height = Math.Abs(r.Height);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...