Как можно оптимизировать данный код?
Дело в чем, уже который раз сталкиваюсь с подобными конструкциями в чужом коде (я сам новичок, поэтому может глупый вопрос):
if(i == 0)
{
_mov[0] = Vector3Int.forward;
_mov[1] = Vector3Int.forward * -1;
_mov[2] = Vector3Int.right;
_mov[3] = Vector3Int.left;
}
else if(i == 1)
{
_mov[0] = Vector3Int.left;
_mov[1] = Vector3Int.right;
_mov[2] = Vector3Int.forward;
_mov[3] = Vector3Int.forward * -1;
}
else if(i == 2)
{
_mov[0] = Vector3Int.forward * -1;
_mov[1] = Vector3Int.forward;
_mov[2] = Vector3Int.left;
_mov[3] = Vector3Int.right;
}
else
{
_mov[0] = Vector3Int.right;
_mov[1] = Vector3Int.left;
_mov[2] = Vector3Int.forward * -1;
_mov[3] = Vector3Int.forward;
}
Вопрос заключается в том, можно ли это сделать как-то более просто? Вряд-ли же возможна только такая реализация... Заранее спасибо за ответ!!
Ответы (3 шт):
Как минимум можно не в каждой строчке в ячейку писать, а в одну строку, типа _mov = {..., ... ,..., ...}. Во-вторых нужно вообще понимание что это за mov и зачем он нужен. Вполне возможно тут нужен не глупый массив, а объект, и инициализировать данный объект через конструктор. А Все if'ы можно заменить мапой, где ключ - число, значение - объект с заданными параметрами. Далее просто выдёргивать по ключу объект и пользоваться им
Примерная реализация.
Объект
class Mover {
поле1 = null
поле2 = null
поле3 = null
поле4 = null
конструктор Mover(поле1, поле2, поле3, поле4) {
присваивание значений
}
}
Мапа
Dictionary<int, Mover> myDictionary = new Dictionary<int, Mover>() {
{0, new Mover(..., ..., ..., ...)},
{1, new Mover(..., ..., ..., ...)},
{2, new Mover(..., ..., ..., ...)},
{-1, new Mover(..., ..., ..., ...)},
};
Далее в коде
if (myDictionary.TryGetValue(КЛЮЧ, out value)) {
} else {
myDictionary.TryGetValue(-1, out value);
}
Вместо if/else можно изначально дефолтное значение задать переменной, а потом просто применить TryGetValue по ключу. Если получится достать - то значение в переменной изменится, а если нет, то останется дефолтным
типа
value = myDictionary[-1]; // это псевдокод, я не знаю как это выглядит в C#
myDictionary.TryGetValue(КЛЮЧ, out value)
Поиграем с поворотами базового вектора forward на нужные углы:
for j = 0..3
an = pi/2 * (i - (j&1)<<1 - (j&2)>>1)
s,c = sincos(an)
[ c -s]
mov[j] = (fx, fy) * [ ]
[ s c]
где fx, fy - компоненты forward вектора
На Python: https://onlinegdb.com/ZZZDh18TXK
И без тригонометрии: https://onlinegdb.com/HUl2ZDb6KR
Код можно упростить, например, так:
var f = Vector3Int.forward;
var b = Vector3Int.back;
var r = Vector3Int.right;
var l = Vector3Int.left;
(_mov[0], _mov[1], _mov[2], _mov[3]) = i switch
{
0 => (f, b, r, l),
1 => (l, r, f, b),
2 => (b, f, l, r),
_ => (r, l, b, f),
};